{"version":3,"sources":["../src/core/DataStore.ts","../src/core/ScaleManager.ts","../src/core/EventEmitter.ts","../src/core/themes.ts","../src/core/uiConfig.ts","../src/core/labels.ts","../src/interaction/PanHandler.ts","../src/interaction/ZoomHandler.ts","../src/series/CandlestickSeries.ts","../src/series/HollowCandleSeries.ts","../src/series/LineSeries.ts","../src/series/OHLCSeries.ts","../src/series/VolumeSeries.ts","../src/series/HeikinAshiSeries.ts","../src/series/VolumeCandles.ts","../src/series/LineWithMarkers.ts","../src/series/StepLineSeries.ts","../src/series/HLCAreaSeries.ts","../src/series/BaselineSeries.ts","../src/series/ColumnSeries.ts","../src/series/HighLowSeries.ts","../src/overlays/GridOverlay.ts","../src/overlays/CrosshairOverlay.ts","../src/overlays/TradeLevelCluster.ts","../src/overlays/TradeLevelOverlay.ts","../src/overlays/OffViewportLevelIndicator.ts","../src/axis/TimeAxis.ts","../src/axis/PriceAxis.ts","../src/ui/icons.ts","../src/ui/keyboardAware.ts","../src/ui/TopBar.ts","../src/ui/BottomBar.ts","../src/ui/LeftBar.ts","../src/drawings/styleUtils.ts","../src/drawings/HorizontalLine.ts","../src/drawings/VerticalLine.ts","../src/drawings/TrendLine.ts","../src/drawings/TrendAngle.ts","../src/drawings/CrossLine.ts","../src/drawings/ParallelChannel.ts","../src/drawings/FlatChannel.ts","../src/drawings/DisjointChannel.ts","../src/drawings/FibRetracement.ts","../src/drawings/FibExtension.ts","../src/drawings/FibChannel.ts","../src/drawings/FibTimezone.ts","../src/drawings/FibCircles.ts","../src/drawings/FibSpiral.ts","../src/drawings/FibFan.ts","../src/drawings/FibProjection.ts","../src/drawings/GannFan.ts","../src/drawings/GannSquare.ts","../src/drawings/GannBox.ts","../src/drawings/Rectangle.ts","../src/drawings/RotatedRectangle.ts","../src/drawings/Ellipse.ts","../src/drawings/Triangle.ts","../src/drawings/Circle.ts","../src/drawings/Arc.ts","../src/drawings/Polyline.ts","../src/drawings/Path.ts","../src/drawings/PriceRange.ts","../src/drawings/DateRange.ts","../src/drawings/DatePriceRange.ts","../src/drawings/Ruler.ts","../src/drawings/Pitchfork.ts","../src/drawings/SchiffPitchfork.ts","../src/drawings/ModifiedSchiff.ts","../src/drawings/InsidePitchfork.ts","../src/drawings/FixedRangeVP.ts","../src/drawings/AnchoredVP.ts","../src/drawings/VolumeProfile.ts","../src/drawings/RegressionTrend.ts","../src/drawings/Text.ts","../src/drawings/Callout.ts","../src/drawings/PriceLabel.ts","../src/drawings/ArrowMarker.ts","../src/drawings/Flag.ts","../src/drawings/PriceNote.ts","../src/drawings/AnchoredNote.ts","../src/drawings/ArrowUp.ts","../src/drawings/ArrowDown.ts","../src/drawings/HeadShoulders.ts","../src/drawings/TrianglePattern.ts","../src/drawings/ThreeDrives.ts","../src/drawings/AbcdPattern.ts","../src/drawings/CypherPattern.ts","../src/drawings/ButterflyPattern.ts","../src/drawings/BatPattern.ts","../src/drawings/GartleyPattern.ts","../src/drawings/CrabPattern.ts","../src/drawings/SharkPattern.ts","../src/drawings/ElliottImpulse.ts","../src/drawings/ElliottCorrective.ts","../src/drawings/ElliottTriangle.ts","../src/drawings/ElliottCombination.ts","../src/drawings/ElliottWxy.ts","../src/drawings/Brush.ts","../src/drawings/Highlighter.ts","../src/drawings/SineLine.ts","../src/drawings/CyclicLines.ts","../src/drawings/TimeCycles.ts","../src/drawings/Projection.ts","../src/drawings/PriceProjection.ts","../src/drawings/GhostFeed.ts","../src/drawings/DrawingManager.ts","../src/ui/IndicatorOverlay.ts","../src/ui/IndicatorSettingsDialog.ts","../src/ui/ChartSettingsDialog.ts","../src/ui/TradeButton.ts","../src/ui/TradePopover.ts","../src/ui/DrawingStylePopover.ts","../src/ui/DraftQtyFlyout.ts","../src/ui/IsinPickerModal.ts","../src/interaction/TradeDragHandler.ts","../src/indicators/sourceField.ts","../src/indicators/SMA.ts","../src/indicators/EMA.ts","../src/indicators/WMA.ts","../src/indicators/HMA.ts","../src/indicators/MARibbon.ts","../src/indicators/BollingerBands.ts","../src/indicators/KeltnerChannels.ts","../src/indicators/DonchianChannels.ts","../src/indicators/ATR.ts","../src/indicators/RSI.ts","../src/indicators/Stochastic.ts","../src/indicators/StochRSI.ts","../src/indicators/MACD.ts","../src/indicators/CCI.ts","../src/indicators/WilliamsR.ts","../src/indicators/ROC.ts","../src/indicators/OBV.ts","../src/indicators/VWAP.ts","../src/indicators/AccDistribution.ts","../src/indicators/MFI.ts","../src/indicators/CMF.ts","../src/indicators/PivotPoints.ts","../src/indicators/FibRetracementIndicator.ts","../src/indicators/Supertrend.ts","../src/indicators/ParabolicSAR.ts","../src/indicators/IchimokuCloud.ts","../src/indicators/ADX.ts","../src/indicators/AwesomeOscillator.ts","../src/indicators/HeikinAshi.ts","../src/indicators/VOL.ts","../src/indicators/LinearRegression.ts","../src/core/indicators.json","../src/utils/aggregateCandles.ts","../src/ChartEngine.ts","../src/data/WebSocketAdapter.ts"],"names":["withAlpha","PILL_PAD_X","PILL_GAP","d","step","DURATIONS","HIT_TOLERANCE","pointToSegmentDist","FIB_LEVELS","drawArrowhead","extendToX","BAR_WEIGHTS","roundedRect","BADGE_H","PAD_H","LABELS","effectiveY","rawPrice","FIB_RATIOS","started","barMs","level","lastBar"],"mappings":";;;;;;AAEO,IAAM,YAAN,MAAgB;AAAA,EAAhB,WAAA,GAAA;AACH,IAAA,IAAA,CAAQ,OAAmB,EAAC;AAAA,EAAA;AAAA,EAE5B,IAAI,IAAA,EAAwB;AAExB,IAAA,IAAA,CAAK,IAAA,GAAO,CAAC,GAAG,IAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,IAAI,CAAA;AAAA,EACxD;AAAA,EAEA,IAAI,GAAA,GAAkB;AAClB,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EAChB;AAAA,EAEA,IAAI,MAAA,GAAiB;AACjB,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA;AAAA,EACrB;AAAA,EAEA,WAAW,QAAA,EAAgC;AACvC,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,QAAA,CAAS,UAAU,CAAC,CAAA;AACzD,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AAAA,MACb,IAAA,CAAK,KAAK,MAAA,GAAS,CAAA;AAAA,MACnB,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAQ;AAAA,KAC/B;AACA,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,EACzC;AAAA,EAEA,aAAA,CAAc,QAAA,EAAoB,OAAA,GAAU,IAAA,EAAkB;AAC1D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AACxC,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,KAAK,CAAA,EAAE;AAElD,IAAA,IAAI,GAAA,GAAM,QAAA;AACV,IAAA,IAAI,GAAA,GAAM,CAAA,QAAA;AAEV,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACvB,MAAA,IAAI,GAAA,CAAI,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,GAAA,CAAI,GAAA;AAC7B,MAAA,IAAI,GAAA,CAAI,IAAA,GAAO,GAAA,EAAK,GAAA,GAAM,GAAA,CAAI,IAAA;AAAA,IAClC;AAEA,IAAA,MAAM,QAAQ,GAAA,GAAM,GAAA;AACpB,IAAA,OAAO;AAAA,MACH,GAAA,EAAK,MAAM,KAAA,GAAQ,OAAA;AAAA,MACnB,GAAA,EAAK,MAAM,KAAA,GAAQ;AAAA,KACvB;AAAA,EACJ;AAAA,EAEA,eAAe,QAAA,EAAkD;AAC7D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA;AACxC,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,KAAK,CAAA,EAAE;AAClD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,IAAU,CAAC,CAAC,CAAA;AACzD,IAAA,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAI;AAAA,EACzB;AAAA,EAEA,IAAI,aAAA,GAAyB;AACzB,IAAA,OAAO,IAAA,CAAK,KAAK,IAAA,CAAK,CAAA,CAAA,KAAK,YAAY,CAAA,IAAA,CAAM,CAAA,CAAE,MAAA,IAAU,CAAA,IAAK,CAAC,CAAA;AAAA,EACnE;AAAA,EAEA,iBAAA,GAA4B;AACxB,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,IAAA,EAAM;AACzB,MAAA,KAAA,MAAW,CAAA,IAAK,CAAC,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,MAAM,GAAA,CAAI,GAAA,EAAK,GAAA,CAAI,KAAK,CAAA,EAAG;AACtD,QAAA,MAAM,CAAA,GAAI,EAAE,QAAA,EAAS;AACrB,QAAA,MAAM,GAAA,GAAM,CAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AACzB,QAAA,IAAI,QAAQ,EAAA,EAAI;AACZ,UAAA,MAAM,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,GAAA,GAAM,CAAA;AAC3B,UAAA,IAAI,CAAA,GAAI,KAAK,GAAA,GAAM,CAAA;AAAA,QACvB;AAAA,MACJ;AAAA,IACJ;AACA,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,CAAC,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAQ,IAAA,EAA0B;AAC9B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,CAAC,GAAG,IAAA,IAAQ,QAAA;AACrC,IAAA,MAAM,QAAA,GAAW,IAAA,CACZ,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,IAAA,GAAO,MAAM,CAAA,CAC3B,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,IAAA,GAAO,EAAE,IAAI,CAAA;AACnC,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,OAAO,CAAC,GAAG,QAAA,EAAU,GAAG,KAAK,IAAI,CAAA;AACtC,IAAA,OAAO,QAAA,CAAS,MAAA;AAAA,EACpB;AACJ,CAAA;;;ACrFO,IAAM,aAAA,GAAN,MAAM,aAAA,CAAa;AAAA;AAAA,EAKxB,QAAA,CAAS,KAAA,EAAe,QAAA,EAAoB,UAAA,EAA4B;AACtE,IAAA,MAAM,cAAc,IAAA,CAAK,GAAA,CAAI,GAAG,QAAA,CAAS,QAAA,GAAW,SAAS,UAAU,CAAA;AACvE,IAAA,MAAM,cAAc,UAAA,GAAa,WAAA;AACjC,IAAA,OAAA,CAAQ,KAAA,GAAQ,QAAA,CAAS,UAAA,IAAc,WAAA,GAAc,WAAA,GAAc,CAAA;AAAA,EACrE;AAAA,EAEA,eAAA,CAAgB,CAAA,EAAW,QAAA,EAAoB,UAAA,EAA4B;AACzE,IAAA,MAAM,cAAc,IAAA,CAAK,GAAA,CAAI,GAAG,QAAA,CAAS,QAAA,GAAW,SAAS,UAAU,CAAA;AACvE,IAAA,MAAM,cAAc,UAAA,GAAa,WAAA;AACjC,IAAA,OAAO,QAAA,CAAS,UAAA,GAAa,CAAA,GAAI,WAAA,GAAc,GAAA;AAAA,EACjD;AAAA,EAEA,eAAA,CAAgB,UAAoB,UAAA,EAA4B;AAC9D,IAAA,MAAM,cAAc,IAAA,CAAK,GAAA,CAAI,GAAG,QAAA,CAAS,QAAA,GAAW,SAAS,UAAU,CAAA;AACvE,IAAA,MAAM,GAAA,GAAO,aAAa,WAAA,GAAe,GAAA;AACzC,IAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,GAAA,EAAK,EAAE,CAAC,CAAA;AAAA,EACtC;AAAA;AAAA,EAIA,QAAA,CAAS,KAAA,EAAe,KAAA,EAAmB,WAAA,EAA6B;AACtE,IAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,KAAA;AACrB,IAAA,MAAM,MAAM,aAAA,CAAa,mBAAA;AACzB,IAAA,MAAM,MAAA,GAAS,cAAc,CAAA,GAAI,GAAA;AACjC,IAAA,OAAO,GAAA,GAAM,MAAA,GAAA,CAAW,KAAA,GAAQ,GAAA,KAAQ,MAAM,GAAA,CAAA,GAAQ,MAAA;AAAA,EACxD;AAAA,EAEA,YAAA,CAAa,CAAA,EAAW,KAAA,EAAmB,WAAA,EAA6B;AACtE,IAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,KAAA;AACrB,IAAA,MAAM,MAAM,aAAA,CAAa,mBAAA;AACzB,IAAA,MAAM,MAAA,GAAS,cAAc,CAAA,GAAI,GAAA;AACjC,IAAA,OAAO,GAAA,GAAA,CAAQ,CAAA,GAAI,GAAA,IAAO,MAAA,IAAW,GAAA,GAAM,GAAA,CAAA;AAAA,EAC7C;AAAA;AAAA,EAIA,aAAA,CACE,MAAA,EACA,SAAA,EACA,iBAAA,EACQ;AACR,IAAA,OAAO,iBAAA,GAAqB,MAAA,GAAS,SAAA,GAAa,iBAAA,GAAoB,GAAA;AAAA,EACxE;AACF,CAAA;AAhDa,aAAA,CACa,mBAAA,GAAsB,EAAA;AADzC,IAAM,YAAA,GAAN,aAAA;AAqDP,SAAS,SAAS,OAAA,EAAyB;AACzC,EAAA,IAAI,CAAC,QAAA,CAAS,OAAO,CAAA,IAAK,OAAA,IAAW,GAAG,OAAO,CAAA;AAC/C,EAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC,CAAA;AAC1C,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,GAAG,CAAA;AAC7B,EAAA,MAAM,OAAO,OAAA,GAAU,IAAA;AACvB,EAAA,MAAM,IAAA,GAAO,OAAO,GAAA,GAAM,CAAA,GAAI,OAAO,GAAA,GAAM,CAAA,GAAI,IAAA,GAAO,GAAA,GAAM,CAAA,GAAI,EAAA;AAChE,EAAA,OAAO,IAAA,GAAO,IAAA;AAChB;AAOO,SAAS,kBAAA,CACd,KAAA,EACA,WAAA,EACA,gBAAA,GAAmB,EAAA,EACT;AACV,EAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,KAAA;AACrB,EAAA,IAAI,CAAC,QAAA,CAAS,GAAG,CAAA,IAAK,CAAC,QAAA,CAAS,GAAG,CAAA,IAAK,GAAA,IAAO,GAAA,EAAK,OAAO,CAAC,GAAG,CAAA;AAC/D,EAAA,MAAM,WAAA,GAAc,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,WAAA,GAAc,gBAAgB,CAAC,CAAA;AAC1E,EAAA,MAAM,OAAA,GAAA,CAAW,MAAM,GAAA,IAAO,WAAA;AAC9B,EAAA,MAAM,IAAA,GAAO,SAAS,OAAO,CAAA;AAC7B,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,IAAI,CAAA,GAAI,IAAA;AACtC,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,MAAM,MAAM,IAAA,GAAO,IAAA;AACnB,EAAA,KAAA,IAAS,IAAI,KAAA,EAAO,CAAA,IAAK,GAAA,GAAM,GAAA,EAAK,KAAK,IAAA,EAAM;AAC7C,IAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,EACd;AACA,EAAA,OAAO,KAAA;AACT;AAMO,SAAS,gBAAA,CAAiB,IAAA,EAAc,YAAA,GAAe,CAAA,EAAW;AACvE,EAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,IAAK,IAAA,IAAQ,GAAG,OAAO,YAAA;AACzC,EAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AACvC,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,CAAC,GAAG,CAAA;AACpC;;;AC/FO,IAAM,eAAN,MAA6D;AAAA,EAA7D,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,SAAA,uBAAgB,GAAA,EAA4C;AAAA,EAAA;AAAA,EAEpE,EAAA,CAA6B,OAAU,QAAA,EAA6C;AAClF,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,EAAG;AAC9B,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAA,kBAAO,IAAI,KAAK,CAAA;AAAA,IACrC;AACA,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,CAAG,IAAI,QAA6B,CAAA;AAE5D,IAAA,OAAO,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,QAAQ,CAAA;AAAA,EACvC;AAAA,EAEA,GAAA,CAA8B,OAAU,QAAA,EAAuC;AAC7E,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,QAA6B,CAAA;AAAA,EACjE;AAAA,EAEA,IAAA,CAA+B,OAAU,OAAA,EAA4B;AACnE,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,KAAK,CAAA,EAAG,QAAQ,CAAC,EAAA,KAAO,EAAA,CAAG,OAAO,CAAC,CAAA;AAAA,EACxD;AACF,CAAA;;;AC8JO,SAAS,cAAA,CACZ,MACA,QAAA,EACU;AACV,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,EAAA,OAAO;AAAA,IACH,UAAA,EAAY,QAAA,CAAS,UAAA,IAAc,IAAA,CAAK,UAAA;AAAA,IACxC,IAAA,EAAY,QAAA,CAAS,IAAA,IAAc,IAAA,CAAK,IAAA;AAAA,IACxC,QAAA,EAAY,QAAA,CAAS,QAAA,IAAc,IAAA,CAAK,QAAA;AAAA,IACxC,UAAA,EAAY,QAAA,CAAS,UAAA,IAAc,IAAA,CAAK,UAAA;AAAA,IACxC,SAAA,EAAY,QAAA,CAAS,SAAA,IAAc,IAAA,CAAK,SAAA;AAAA,IACxC,SAAkB,EAAE,GAAG,KAAK,OAAA,EAAkB,GAAG,SAAS,OAAA,EAAQ;AAAA,IAClE,QAAkB,EAAE,GAAG,KAAK,MAAA,EAAkB,GAAG,SAAS,MAAA,EAAO;AAAA,IACjE,QAAkB,EAAE,GAAG,KAAK,MAAA,EAAkB,GAAG,SAAS,MAAA,EAAO;AAAA,IACjE,EAAA,EAAI;AAAA,MACA,GAAG,IAAA,CAAK,EAAA;AAAA,MACR,GAAG,QAAA,CAAS,EAAA;AAAA,MACZ,MAAA,EAAQ,EAAE,GAAG,IAAA,CAAK,GAAG,MAAA,EAAQ,GAAG,QAAA,CAAS,EAAA,EAAI,MAAA;AAAO,KACxD;AAAA,IACA,gBAAkB,EAAE,GAAG,KAAK,cAAA,EAAkB,GAAG,SAAS,cAAA,EAAe;AAAA,IACzE,QAAkB,EAAE,GAAG,KAAK,MAAA,EAAkB,GAAG,SAAS,MAAA,EAAO;AAAA,IACjE,WAAkB,EAAE,GAAG,KAAK,SAAA,EAAkB,GAAG,SAAS,SAAA,EAAU;AAAA,IACpE,kBAAkB,EAAE,GAAG,KAAK,gBAAA,EAAkB,GAAG,SAAS,gBAAA,EAAiB;AAAA,IAC3E,aAAkB,EAAE,GAAG,KAAK,WAAA,EAAkB,GAAG,SAAS,WAAA,EAAY;AAAA,IACtE,YAAkB,EAAE,GAAG,KAAK,UAAA,EAAkB,GAAG,SAAS,UAAA,EAAW;AAAA,IACrE,OAAA,EAAkB,iBAAA,CAAkB,IAAA,CAAK,OAAA,EAAS,SAAS,OAAO;AAAA,GACtE;AACJ;AAOA,SAAS,iBAAA,CACL,MACA,QAAA,EACe;AACf,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,IAAA,EAAK;AACzB,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,EAAwB;AAC1D,IAAA,MAAM,CAAA,GAAI,SAAS,GAAG,CAAA;AACtB,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,MAAA,CAAO,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,EACvC;AACA,EAAA,OAAO,MAAA;AACX;AAUO,SAAS,qBAAA,CACZ,OACA,SAAA,EACU;AACV,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,EAAA,GAAA,CAAI,MAAM,OAAA,GAAU,MAAA;AACpB,EAAA,SAAA,CAAU,YAAY,GAAG,CAAA;AAEzB,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,KAA0B;AACvC,IAAA,IAAI,CAAC,KAAA,CAAM,QAAA,CAAS,MAAM,GAAG,OAAO,KAAA;AAEpC,IAAA,KAAA,GAAQ,KAAA,CAAM,OAAA;AAAA,MACV,+CAAA;AAAA,MACA;AAAA,KACJ;AACA,IAAA,GAAA,CAAI,MAAM,KAAA,GAAQ,EAAA;AAClB,IAAA,GAAA,CAAI,MAAM,KAAA,GAAQ,KAAA;AAClB,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,GAAG,CAAA,CAAE,KAAA;AACvC,IAAA,OAAO,QAAA,IAAY,KAAA;AAAA,EACvB,CAAA;AAEA,EAAA,MAAM,MAAA,GAAqB;AAAA,IACvB,UAAA,EAAY,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA;AAAA,IACpC,IAAA,EAAY,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAAA,IAC9B,QAAA,EAAY,OAAA,CAAQ,KAAA,CAAM,QAAQ,CAAA;AAAA,IAClC,UAAA,EAAY,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA;AAAA,IACpC,SAAA,EAAY,OAAA,CAAQ,KAAA,CAAM,SAAS,CAAA;AAAA,IACnC,OAAA,EAAS;AAAA,MACL,UAAA,EAAY,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA;AAAA,MAC5C,IAAA,EAAY,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,MACtC,MAAA,EAAY,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,MAAM;AAAA,KAC5C;AAAA,IACA,MAAA,EAAQ;AAAA,MACJ,EAAA,EAAU,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA;AAAA,MACjC,IAAA,EAAU,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA;AAAA,MACnC,MAAA,EAAU,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AAAA,MACrC,QAAA,EAAU,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA;AAAA,MACvC,GAAI,KAAA,CAAM,MAAA,CAAO,QAAA,KAAe,MAAA,IAAa,EAAE,QAAA,EAAY,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA,EAAE;AAAA,MAC1F,GAAI,KAAA,CAAM,MAAA,CAAO,UAAA,KAAe,MAAA,IAAa,EAAE,UAAA,EAAY,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,UAAU,CAAA;AAAE,KAChG;AAAA,IACA,MAAA,EAAQ;AAAA,MACJ,EAAA,EAAM,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA;AAAA,MAC7B,IAAA,EAAM,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,IAAI;AAAA,KACnC;AAAA,IACA,EAAA,EAAI;AAAA,MACA,MAAA,EAAgB,OAAA,CAAQ,KAAA,CAAM,EAAA,CAAG,MAAM,CAAA;AAAA,MACvC,UAAA,EAAgB,OAAA,CAAQ,KAAA,CAAM,EAAA,CAAG,UAAU,CAAA;AAAA,MAC3C,QAAA,EAAgB,OAAA,CAAQ,KAAA,CAAM,EAAA,CAAG,QAAQ,CAAA;AAAA,MACzC,cAAA,EAAgB,OAAA,CAAQ,KAAA,CAAM,EAAA,CAAG,cAAc,CAAA;AAAA,MAC/C,YAAA,EAAgB,OAAA,CAAQ,KAAA,CAAM,EAAA,CAAG,YAAY,CAAA;AAAA,MAC7C,aAAA,EAAgB,OAAA,CAAQ,KAAA,CAAM,EAAA,CAAG,aAAa,CAAA;AAAA,MAC9C,MAAA,EAAQ;AAAA,QACJ,SAAA,EAAc,OAAA,CAAQ,KAAA,CAAM,EAAA,CAAG,OAAO,SAAS,CAAA;AAAA,QAC/C,YAAA,EAAc,OAAA,CAAQ,KAAA,CAAM,EAAA,CAAG,OAAO,YAAY,CAAA;AAAA,QAClD,YAAA,EAAc,OAAA,CAAQ,KAAA,CAAM,EAAA,CAAG,OAAO,YAAY;AAAA;AACtD,KACJ;AAAA,IACA,cAAA,EAAgB;AAAA,MACZ,SAAA,EAAoB,OAAA,CAAQ,KAAA,CAAM,cAAA,CAAe,SAAS,CAAA;AAAA,MAC1D,eAAA,EAAoB,OAAA,CAAQ,KAAA,CAAM,cAAA,CAAe,eAAe,CAAA;AAAA,MAChE,gBAAA,EAAoB,OAAA,CAAQ,KAAA,CAAM,cAAA,CAAe,gBAAgB,CAAA;AAAA,MACjE,kBAAA,EAAoB,OAAA,CAAQ,KAAA,CAAM,cAAA,CAAe,kBAAkB;AAAA,KACvE;AAAA,IACA,MAAA,EAAQ;AAAA,MACJ,QAAA,EAAqB,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA;AAAA,MAClD,cAAA,EAAqB,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,cAAc,CAAA;AAAA,MACxD,cAAA,EAAqB,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,cAAc,CAAA;AAAA,MACxD,mBAAA,EAAqB,OAAA,CAAQ,KAAA,CAAM,MAAA,CAAO,mBAAmB;AAAA,KACjE;AAAA,IACA,SAAA,EAAW;AAAA,MACP,QAAA,EAAiB,OAAA,CAAQ,KAAA,CAAM,SAAA,CAAU,QAAQ,CAAA;AAAA,MACjD,WAAA,EAAiB,OAAA,CAAQ,KAAA,CAAM,SAAA,CAAU,WAAW,CAAA;AAAA,MACpD,aAAA,EAAiB,OAAA,CAAQ,KAAA,CAAM,SAAA,CAAU,aAAa,CAAA;AAAA,MACtD,eAAA,EAAiB,OAAA,CAAQ,KAAA,CAAM,SAAA,CAAU,eAAe;AAAA,KAC5D;AAAA,IACA,gBAAA,EAAkB;AAAA,MACd,MAAA,EAAiB,OAAA,CAAQ,KAAA,CAAM,gBAAA,CAAiB,MAAM,CAAA;AAAA,MACtD,SAAA,EAAiB,OAAA,CAAQ,KAAA,CAAM,gBAAA,CAAiB,SAAS,CAAA;AAAA,MACzD,eAAA,EAAiB,OAAA,CAAQ,KAAA,CAAM,gBAAA,CAAiB,eAAe;AAAA,KACnE;AAAA,IACA,WAAA,EAAa;AAAA,MACT,OAAA,EAAiB,OAAA,CAAQ,KAAA,CAAM,WAAA,CAAY,OAAO,CAAA;AAAA,MAClD,QAAA,EAAiB,OAAA,CAAQ,KAAA,CAAM,WAAA,CAAY,QAAQ,CAAA;AAAA,MACnD,SAAA,EAAiB,OAAA,CAAQ,KAAA,CAAM,WAAA,CAAY,SAAS,CAAA;AAAA,MACpD,YAAA,EAAiB,OAAA,CAAQ,KAAA,CAAM,WAAA,CAAY,YAAY,CAAA;AAAA,MACvD,cAAA,EAAiB,OAAA,CAAQ,KAAA,CAAM,WAAA,CAAY,cAAc,CAAA;AAAA,MACzD,eAAA,EAAiB,OAAA,CAAQ,KAAA,CAAM,WAAA,CAAY,eAAe,CAAA;AAAA,MAC1D,SAAA,EAAiB,OAAA,CAAQ,KAAA,CAAM,WAAA,CAAY,SAAS,CAAA;AAAA,MACpD,QAAA,EAAiB,OAAA,CAAQ,KAAA,CAAM,WAAA,CAAY,QAAQ,CAAA;AAAA,MACnD,YAAA,EAAiB,OAAA,CAAQ,KAAA,CAAM,WAAA,CAAY,YAAY,CAAA;AAAA,MACvD,KAAA,EAAiB,OAAA,CAAQ,KAAA,CAAM,WAAA,CAAY,KAAK,CAAA;AAAA,MAChD,UAAA,EAAiB,OAAA,CAAQ,KAAA,CAAM,WAAA,CAAY,UAAU,CAAA;AAAA,MACrD,UAAA,EAAiB,OAAA,CAAQ,KAAA,CAAM,WAAA,CAAY,UAAU,CAAA;AAAA,MACrD,eAAA,EAAiB,OAAA,CAAQ,KAAA,CAAM,WAAA,CAAY,eAAe;AAAA,KAC9D;AAAA,IACA,UAAA,EAAY;AAAA,MACR,UAAA,EAAa,OAAA,CAAQ,KAAA,CAAM,UAAA,CAAW,UAAU,CAAA;AAAA,MAChD,MAAA,EAAa,OAAA,CAAQ,KAAA,CAAM,UAAA,CAAW,MAAM,CAAA;AAAA,MAC5C,QAAA,EAAa,OAAA,CAAQ,KAAA,CAAM,UAAA,CAAW,QAAQ,CAAA;AAAA,MAC9C,SAAA,EAAa,OAAA,CAAQ,KAAA,CAAM,UAAA,CAAW,SAAS,CAAA;AAAA,MAC/C,WAAA,EAAa,OAAA,CAAQ,KAAA,CAAM,UAAA,CAAW,WAAW,CAAA;AAAA,MACjD,UAAA,EAAa,OAAA,CAAQ,KAAA,CAAM,UAAA,CAAW,UAAU,CAAA;AAAA,MAChD,OAAA,EAAa,OAAA,CAAQ,KAAA,CAAM,UAAA,CAAW,OAAO,CAAA;AAAA,MAC7C,UAAA,EAAa,OAAA,CAAQ,KAAA,CAAM,UAAA,CAAW,UAAU;AAAA,KACpD;AAAA,IACA,OAAA,EAAS,uBAAA,CAAwB,KAAA,CAAM,OAAA,EAAS,OAAO;AAAA,GAC3D;AAEA,EAAA,SAAA,CAAU,YAAY,GAAG,CAAA;AACzB,EAAA,OAAO,MAAA;AACX;AAGA,SAAS,uBAAA,CACL,SACA,OAAA,EACe;AACf,EAAA,MAAM,MAAM,EAAC;AACb,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,EAAwB;AACzD,IAAA,MAAM,KAAA,GAAQ,QAAQ,GAAG,CAAA;AACzB,IAAA,MAAM,QAAA,GAA4B,EAAE,GAAG,KAAA,EAAM;AAC7C,IAAA,IAAI,SAAS,WAAA,EAAa,QAAA,CAAS,WAAA,GAAc,OAAA,CAAQ,SAAS,WAAW,CAAA;AAC7E,IAAA,IAAI,SAAS,SAAA,EAAa,QAAA,CAAS,SAAA,GAAc,OAAA,CAAQ,SAAS,SAAS,CAAA;AAC3E,IAAA,IAAI,WAAA,IAAe,QAAA,IAAY,QAAA,CAAS,SAAA,EAAW;AAC/C,MAAA,QAAA,CAAS,SAAA,GAAY,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA;AAAA,IACnD;AACA,IAAA,IAAI,QAAA,IAAY,QAAA,IAAY,QAAA,CAAS,MAAA,EAAQ;AACzC,MAAA,MAAM,SAA8D,EAAC;AACrE,MAAA,KAAA,MAAW,EAAA,IAAM,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AAC3C,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,MAAA,CAAO,EAAE,CAAA;AAC7B,QAAA,MAAA,CAAO,EAAE,IAAI,EAAE,GAAG,IAAI,KAAA,EAAO,OAAA,CAAQ,EAAA,CAAG,KAAK,CAAA,EAAE;AAAA,MACnD;AACA,MAAA,QAAA,CAAS,MAAA,GAAS,MAAA;AAAA,IACtB;AACA,IAAA,GAAA,CAAI,GAAG,CAAA,GAAI,QAAA;AAAA,EACf;AACA,EAAA,OAAO,GAAA;AACX;AAaO,IAAM,qBAAA,GAAyC;AAAA;AAAA,EAElD,gBAAiB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,QAAA,EAAS;AAAA,EAC7E,cAAiB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,QAAA,EAAS;AAAA,EAC7E,WAAiB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EAC5E,WAAiB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,QAAA,EAAS;AAAA,EAC7E,YAAiB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA;AAAA,EAG5E,WAAA,EAAiB,EAAE,WAAA,EAAa,SAAA,EAAW,SAAA,EAAW,CAAA,EAAG,SAAA,EAAW,OAAA,EAAS,SAAA,EAAW,SAAA,EAAW,WAAA,EAAa,IAAA,EAAK;AAAA,EACrH,eAAA,EAAiB,EAAE,WAAA,EAAa,SAAA,EAAW,SAAA,EAAW,CAAA,EAAG,SAAA,EAAW,OAAA,EAAS,SAAA,EAAW,SAAA,EAAW,WAAA,EAAa,IAAA,EAAK;AAAA,EACrH,iBAAiB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA;AAAA,EAG5E,WAAiB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EAC5E,iBAAiB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EAC5E,gBAAiB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EAC5E,iBAAiB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA;AAAA,EAG5E,cAAA,EAAgB;AAAA,IACZ,SAAA,EAAW,CAAA;AAAA,IAAG,SAAA,EAAW,QAAA;AAAA,IACzB,MAAA,EAAQ;AAAA,MACJ,GAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,OAAO,SAAA,EAAU;AAAA,MAC3C,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,OAAO,SAAA,EAAU;AAAA,MAC3C,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,OAAO,SAAA,EAAU;AAAA,MAC3C,KAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,OAAO,SAAA,EAAU;AAAA,MAC3C,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,OAAO,SAAA,EAAU;AAAA,MAC3C,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,OAAO,SAAA,EAAU;AAAA,MAC3C,GAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,OAAO,SAAA;AAAU;AAC/C,GACJ;AAAA,EACA,YAAA,EAAc;AAAA,IACV,SAAA,EAAW,CAAA;AAAA,IAAG,SAAA,EAAW,QAAA;AAAA,IACzB,MAAA,EAAQ;AAAA,MACJ,GAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,OAAO,SAAA,EAAU;AAAA,MAC3C,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,OAAO,SAAA,EAAU;AAAA,MAC3C,GAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,OAAO,SAAA,EAAU;AAAA,MAC3C,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,OAAO,SAAA,EAAU;AAAA,MAC3C,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,OAAO,SAAA,EAAU;AAAA,MAC3C,GAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,OAAO,SAAA,EAAU;AAAA,MAC3C,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,OAAO,SAAA;AAAU;AAC/C,GACJ;AAAA,EACA,aAAA,EAAe;AAAA,IACX,SAAA,EAAW,CAAA;AAAA,IAAG,SAAA,EAAW,QAAA;AAAA,IACzB,MAAA,EAAQ;AAAA,MACJ,GAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,OAAO,SAAA,EAAU;AAAA,MAC3C,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,OAAO,SAAA,EAAU;AAAA,MAC3C,GAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,OAAO,SAAA,EAAU;AAAA,MAC3C,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,OAAO,SAAA,EAAU;AAAA,MAC3C,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,OAAO,SAAA,EAAU;AAAA,MAC3C,GAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,OAAO,SAAA,EAAU;AAAA,MAC3C,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,OAAO,SAAA;AAAU;AAC/C,GACJ;AAAA,EACA,YAAc,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,QAAA,EAAS;AAAA,EAC1E,QAAc,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,QAAA,EAAS;AAAA,EAC1E,YAAc,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,QAAA,EAAS;AAAA,EAC1E,WAAc,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EACzE,aAAc,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,QAAA,EAAS;AAAA;AAAA,EAG1E,SAAA,EAAkB,EAAE,WAAA,EAAa,SAAA,EAAW,SAAA,EAAW,CAAA,EAAG,SAAA,EAAW,OAAA,EAAS,SAAA,EAAW,SAAA,EAAW,WAAA,EAAa,IAAA,EAAK;AAAA,EACtH,gBAAA,EAAkB,EAAE,WAAA,EAAa,SAAA,EAAW,SAAA,EAAW,CAAA,EAAG,SAAA,EAAW,OAAA,EAAS,SAAA,EAAW,SAAA,EAAW,WAAA,EAAa,IAAA,EAAK;AAAA,EACtH,OAAA,EAAkB,EAAE,WAAA,EAAa,SAAA,EAAW,SAAA,EAAW,CAAA,EAAG,SAAA,EAAW,OAAA,EAAS,SAAA,EAAW,SAAA,EAAW,WAAA,EAAa,IAAA,EAAK;AAAA,EACtH,MAAA,EAAkB,EAAE,WAAA,EAAa,SAAA,EAAW,SAAA,EAAW,CAAA,EAAG,SAAA,EAAW,OAAA,EAAS,SAAA,EAAW,SAAA,EAAW,WAAA,EAAa,IAAA,EAAK;AAAA,EACtH,QAAA,EAAkB,EAAE,WAAA,EAAa,SAAA,EAAW,SAAA,EAAW,CAAA,EAAG,SAAA,EAAW,OAAA,EAAS,SAAA,EAAW,SAAA,EAAW,WAAA,EAAa,IAAA,EAAK;AAAA,EACtH,KAAkB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EAC7E,UAAkB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EAC7E,MAAkB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EAC7E,UAAkB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA;AAAA,EAG7E,OAAa,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EACxE,WAAA,EAAa,EAAE,WAAA,EAAa,SAAA,EAAW,WAAW,CAAA,EAAG,SAAA,EAAW,OAAA,EAAS,WAAA,EAAa,GAAA,EAAI;AAAA;AAAA,EAG1F,MAAc,EAAE,SAAA,EAAW,WAAW,QAAA,EAAU,EAAA,EAAI,aAAa,SAAA,EAAU;AAAA,EAC3E,OAAA,EAAc,EAAE,SAAA,EAAW,SAAA,EAAW,QAAA,EAAU,EAAA,EAAI,WAAA,EAAa,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,WAAA,EAAa,IAAA,EAAK;AAAA,EACpH,UAAA,EAAc,EAAE,SAAA,EAAW,SAAA,EAAW,QAAA,EAAU,EAAA,EAAI,WAAA,EAAa,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,WAAA,EAAa,CAAA,EAAE;AAAA,EACjH,WAAc,EAAE,SAAA,EAAW,WAAW,QAAA,EAAU,EAAA,EAAI,aAAa,SAAA,EAAU;AAAA,EAC3E,cAAc,EAAE,SAAA,EAAW,WAAW,QAAA,EAAU,EAAA,EAAI,aAAa,SAAA,EAAU;AAAA;AAAA,EAG3E,OAAA,EAAa,EAAE,WAAA,EAAa,SAAA,EAAW,WAAW,GAAA,EAAK,SAAA,EAAW,SAAA,EAAW,WAAA,EAAa,CAAA,EAAE;AAAA,EAC5F,SAAA,EAAa,EAAE,WAAA,EAAa,SAAA,EAAW,WAAW,GAAA,EAAK,SAAA,EAAW,SAAA,EAAW,WAAA,EAAa,CAAA,EAAE;AAAA,EAC5F,WAAA,EAAa,EAAE,WAAA,EAAa,SAAA,EAAW,WAAW,GAAA,EAAK,SAAA,EAAW,SAAA,EAAW,WAAA,EAAa,CAAA,EAAE;AAAA,EAC5F,IAAA,EAAa,EAAE,WAAA,EAAa,SAAA,EAAW,WAAW,CAAA,EAAG,SAAA,EAAW,SAAA,EAAW,WAAA,EAAa,IAAA,EAAK;AAAA;AAAA,EAG7F,aAAA,EAAe,EAAE,WAAA,EAAa,SAAA,EAAW,WAAW,CAAA,EAAG,SAAA,EAAW,SAAA,EAAW,WAAA,EAAa,IAAA,EAAK;AAAA,EAC/F,UAAA,EAAe,EAAE,WAAA,EAAa,SAAA,EAAW,WAAW,CAAA,EAAG,SAAA,EAAW,SAAA,EAAW,WAAA,EAAa,IAAA,EAAK;AAAA,EAC/F,YAAA,EAAe,EAAE,WAAA,EAAa,SAAA,EAAW,WAAW,CAAA,EAAG,SAAA,EAAW,SAAA,EAAW,WAAA,EAAa,IAAA,EAAK;AAAA;AAAA,EAG/F,aAAkB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EAC7E,gBAAkB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EAC7E,YAAkB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EAC7E,kBAAkB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EAC7E,aAAkB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EAC7E,cAAkB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EAC7E,eAAkB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EAC7E,eAAkB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EAC7E,iBAAkB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EAC7E,aAAkB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA;AAAA,EAG7E,gBAAoB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EAC/E,mBAAoB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EAC/E,iBAAoB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EAC/E,YAAoB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EAC/E,oBAAoB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA;AAAA,EAG/E,SAAY,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EACvE,YAAY,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EACvE,SAAY,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA;AAAA,EAGvE,UAAA,EAAgB,EAAE,WAAA,EAAa,SAAA,EAAW,WAAW,CAAA,EAAG,SAAA,EAAW,SAAA,EAAW,WAAA,EAAa,IAAA,EAAK;AAAA,EAChG,SAAA,EAAgB,EAAE,WAAA,EAAa,SAAA,EAAW,WAAW,CAAA,EAAG,SAAA,EAAW,SAAA,EAAW,WAAA,EAAa,IAAA,EAAK;AAAA,EAChG,cAAA,EAAgB,EAAE,WAAA,EAAa,SAAA,EAAW,WAAW,CAAA,EAAG,SAAA,EAAW,SAAA,EAAW,WAAA,EAAa,IAAA,EAAK;AAAA,EAChG,OAAgB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,QAAA,EAAS;AAAA;AAAA,EAG5E,iBAAkB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,OAAA,EAAQ;AAAA,EAC7E,YAAkB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,QAAA,EAAS;AAAA,EAC9E,aAAkB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,QAAA,EAAS;AAAA,EAC9E,UAAA,EAAkB,EAAE,WAAA,EAAa,SAAA,EAAW,SAAA,EAAW,CAAA,EAAG,SAAA,EAAW,QAAA,EAAU,SAAA,EAAW,SAAA,EAAW,WAAA,EAAa,IAAA,EAAK;AAAA,EACvH,eAAA,EAAkB,EAAE,WAAA,EAAa,SAAA,EAAW,SAAA,EAAW,CAAA,EAAG,SAAA,EAAW,QAAA,EAAU,SAAA,EAAW,SAAA,EAAW,WAAA,EAAa,IAAA,EAAK;AAAA,EACvH,WAAkB,EAAE,WAAA,EAAa,WAAW,SAAA,EAAW,CAAA,EAAG,WAAW,QAAA;AACzE,CAAA;AAIO,IAAM,UAAA,GAAyB;AAAA,EAClC,UAAA,EAAY,SAAA;AAAA,EACZ,IAAA,EAAM,SAAA;AAAA,EACN,QAAA,EAAU,SAAA;AAAA,EACV,UAAA,EAAY,SAAA;AAAA,EACZ,SAAA,EAAW,uBAAA;AAAA,EACX,SAAS,EAAE,UAAA,EAAY,WAAW,IAAA,EAAM,SAAA,EAAW,QAAQ,SAAA,EAAU;AAAA,EACrE,MAAA,EAAQ,EAAE,EAAA,EAAI,SAAA,EAAW,MAAM,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,SAAA,EAAU;AAAA,EACjF,MAAA,EAAQ,EAAE,EAAA,EAAI,sBAAA,EAAwB,MAAM,uBAAA,EAAwB;AAAA,EAEpE,EAAA,EAAI;AAAA,IACA,MAAA,EAAQ,SAAA;AAAA,IACR,UAAA,EAAY,SAAA;AAAA,IACZ,QAAA,EAAU,uBAAA;AAAA,IACV,cAAA,EAAgB,uBAAA;AAAA,IAChB,YAAA,EAAc,SAAA;AAAA,IACd,aAAA,EAAe,SAAA;AAAA,IACf,MAAA,EAAQ;AAAA,MACJ,SAAA,EAAW,SAAA;AAAA,MACX,YAAA,EAAc,SAAA;AAAA,MACd,YAAA,EAAc;AAAA;AAClB,GACJ;AAAA,EAEA,cAAA,EAAgB;AAAA,IACZ,SAAA,EAAW,SAAA;AAAA;AAAA,IACX,eAAA,EAAiB,SAAA;AAAA,IACjB,gBAAA,EAAkB,SAAA;AAAA;AAAA,IAClB,kBAAA,EAAoB;AAAA,GACxB;AAAA,EAEA,MAAA,EAAQ;AAAA,IACJ,QAAA,EAAU,SAAA;AAAA,IACV,cAAA,EAAgB,SAAA;AAAA,IAChB,cAAA,EAAgB,SAAA;AAAA,IAChB,mBAAA,EAAqB;AAAA,GACzB;AAAA,EAEA,SAAA,EAAW;AAAA,IACP,QAAA,EAAU,SAAA;AAAA,IACV,WAAA,EAAa,SAAA;AAAA;AAAA,IACb,aAAA,EAAe,SAAA;AAAA,IACf,eAAA,EAAiB;AAAA,GACrB;AAAA,EAEA,gBAAA,EAAkB;AAAA,IACd,MAAA,EAAQ,qBAAA;AAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,eAAA,EAAiB;AAAA,GACrB;AAAA,EAEA,WAAA,EAAa;AAAA,IACT,OAAA,EAAU,SAAA;AAAA,IACV,QAAA,EAAU,SAAA;AAAA,IACV,SAAA,EAAW,SAAA;AAAA,IACX,YAAA,EAAc,SAAA;AAAA,IACd,cAAA,EAAgB,uBAAA;AAAA,IAChB,eAAA,EAAiB,wBAAA;AAAA,IACjB,SAAA,EAAW,SAAA;AAAA,IACX,QAAA,EAAU,wBAAA;AAAA,IACV,YAAA,EAAc,SAAA;AAAA,IACd,KAAA,EAAO,wBAAA;AAAA,IACP,UAAA,EAAY,wBAAA;AAAA,IACZ,UAAA,EAAY,uBAAA;AAAA,IACZ,eAAA,EAAiB;AAAA,GACrB;AAAA,EAEA,UAAA,EAAY;AAAA,IACR,UAAA,EAAY,SAAA;AAAA,IACZ,MAAA,EAAQ,SAAA;AAAA,IACR,QAAA,EAAU,SAAA;AAAA,IACV,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,SAAA;AAAA,IACb,UAAA,EAAY,wBAAA;AAAA,IACZ,OAAA,EAAS,SAAA;AAAA,IACT,UAAA,EAAY;AAAA,GAChB;AAAA,EAEA,OAAA,EAAS;AACb;AAIO,IAAM,WAAA,GAA0B;AAAA,EACnC,UAAA,EAAY,SAAA;AAAA,EACZ,IAAA,EAAM,SAAA;AAAA,EACN,QAAA,EAAU,SAAA;AAAA,EACV,UAAA,EAAY,SAAA;AAAA,EACZ,SAAA,EAAW,SAAA;AAAA,EACX,SAAS,EAAE,UAAA,EAAY,WAAW,IAAA,EAAM,SAAA,EAAW,QAAQ,SAAA,EAAU;AAAA,EACrE,MAAA,EAAQ,EAAE,EAAA,EAAI,SAAA,EAAW,MAAM,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,SAAA,EAAU;AAAA,EACjF,MAAA,EAAQ,EAAE,EAAA,EAAI,sBAAA,EAAwB,MAAM,uBAAA,EAAwB;AAAA,EAEpE,EAAA,EAAI;AAAA,IACA,MAAA,EAAQ,SAAA;AAAA,IACR,UAAA,EAAY,SAAA;AAAA,IACZ,QAAA,EAAU,uBAAA;AAAA,IACV,cAAA,EAAgB,uBAAA;AAAA,IAChB,YAAA,EAAc,SAAA;AAAA,IACd,aAAA,EAAe,SAAA;AAAA,IACf,MAAA,EAAQ;AAAA,MACJ,SAAA,EAAW,SAAA;AAAA,MACX,YAAA,EAAc,SAAA;AAAA,MACd,YAAA,EAAc;AAAA;AAClB,GACJ;AAAA,EAEA,cAAA,EAAgB;AAAA,IACZ,SAAA,EAAW,SAAA;AAAA;AAAA,IACX,eAAA,EAAiB,SAAA;AAAA,IACjB,gBAAA,EAAkB,SAAA;AAAA,IAClB,kBAAA,EAAoB;AAAA,GACxB;AAAA,EAEA,MAAA,EAAQ;AAAA,IACJ,QAAA,EAAU,SAAA;AAAA,IACV,cAAA,EAAgB,SAAA;AAAA,IAChB,cAAA,EAAgB,SAAA;AAAA,IAChB,mBAAA,EAAqB;AAAA,GACzB;AAAA,EAEA,SAAA,EAAW;AAAA,IACP,QAAA,EAAU,SAAA;AAAA,IACV,WAAA,EAAa,SAAA;AAAA;AAAA,IACb,aAAA,EAAe,SAAA;AAAA,IACf,eAAA,EAAiB;AAAA,GACrB;AAAA,EAEA,gBAAA,EAAkB;AAAA,IACd,MAAA,EAAQ,wBAAA;AAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,eAAA,EAAiB;AAAA,GACrB;AAAA,EAEA,WAAA,EAAa;AAAA,IACT,OAAA,EAAU,SAAA;AAAA,IACV,QAAA,EAAU,SAAA;AAAA,IACV,SAAA,EAAW,SAAA;AAAA,IACX,YAAA,EAAc,SAAA;AAAA,IACd,cAAA,EAAgB,uBAAA;AAAA,IAChB,eAAA,EAAiB,wBAAA;AAAA,IACjB,SAAA,EAAW,SAAA;AAAA,IACX,QAAA,EAAU,kBAAA;AAAA,IACV,YAAA,EAAc,SAAA;AAAA,IACd,KAAA,EAAO,2BAAA;AAAA,IACP,UAAA,EAAY,2BAAA;AAAA,IACZ,UAAA,EAAY,SAAA;AAAA,IACZ,eAAA,EAAiB;AAAA,GACrB;AAAA,EAEA,UAAA,EAAY;AAAA,IACR,UAAA,EAAY,SAAA;AAAA,IACZ,MAAA,EAAQ,SAAA;AAAA,IACR,QAAA,EAAU,SAAA;AAAA,IACV,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,SAAA;AAAA,IACb,UAAA,EAAY,kBAAA;AAAA,IACZ,OAAA,EAAS,SAAA;AAAA,IACT,UAAA,EAAY;AAAA,GAChB;AAAA,EAEA,OAAA,EAAS;AACb;;;AClgBA,IAAM,UAAA,GAAa,+EAAA;AAEZ,IAAM,8BAAA,GAAyD;AAAA,EAClE,WAAA,EAA6B,EAAA;AAAA,EAC7B,YAAA,EAA6B,MAAA;AAAA,EAC7B,cAAA,EAA6B,UAAA;AAAA,EAC7B,mBAAA,EAA6B,MAAA;AAAA,EAC7B,qBAAA,EAA6B,UAAA;AAAA,EAC7B,gBAAA,EAA6B,KAAA;AAAA,EAC7B,iBAAA,EAA6B,KAAA;AAAA,EAC7B,qBAAA,EAA6B,MAAA;AAAA,EAC7B,0BAAA,EAA6B,QAAA;AAAA,EAC7B,eAAA,EAA6B,EAAA;AAAA,EAC7B,iBAAA,EAA6B,KAAA;AAAA,EAC7B,UAAA,EAA6B,CAAA;AAAA,EAC7B,MAAA,EAA6B,CAAA;AAAA,EAC7B,gBAAA,EAA6B;AACjC;AAEO,IAAM,sBAAA,GAAyC;AAAA,EAClD,MAAA,EAA8B,MAAA;AAAA,EAC9B,eAAA,EAA8B,MAAA;AAAA,EAC9B,iBAAA,EAA8B,UAAA;AAAA,EAC9B,WAAA,EAA8B,MAAA;AAAA,EAC9B,mBAAA,EAA8B,MAAA;AAAA,EAC9B,WAAA,EAA8B,MAAA;AAAA,EAC9B,iBAAA,EAA8B,MAAA;AAAA,EAC9B,qBAAA,EAA8B,MAAA;AAAA,EAC9B,iBAAA,EAA8B,MAAA;AAAA,EAC9B,mBAAA,EAA8B,UAAA;AAAA,EAC9B,sBAAA,EAA8B,MAAA;AAAA,EAC9B,2BAAA,EAA8B,QAAA;AAAA,EAC9B,mBAAA,EAA8B,MAAA;AAAA,EAC9B,aAAA,EAA8B;AAClC;AAEO,IAAM,yBAAA,GAA+C;AAAA,EACxD,MAAA,EAAe,MAAA;AAAA,EACf,WAAA,EAAe,MAAA;AAAA,EACf,aAAA,EAAe;AACnB;AAEO,IAAM,yBAAA,GAA+C;AAAA,EACxD,QAAA,EAAY,MAAA;AAAA,EACZ,UAAA,EAAY;AAChB;AAEO,IAAM,wBAAA,GAA6C;AAAA,EACtD,QAAA,EAAY,MAAA;AAAA,EACZ,UAAA,EAAY;AAChB;AAEO,IAAM,wBAAA,GAA8C;AAAA,EACvD,WAAA,EAAe,EAAA;AAAA,EACf,aAAA,EAAe,CAAA;AAAA,EACf,QAAA,EAAe,MAAA;AAAA,EACf,UAAA,EAAe;AACnB;AAEO,IAAM,gCAAA,GAA6D;AAAA,EACtE,YAAA,EAAuB,MAAA;AAAA,EACvB,cAAA,EAAuB,UAAA;AAAA,EACvB,WAAA,EAAuB,KAAA;AAAA,EACvB,gBAAA,EAAuB,MAAA;AAAA,EACvB,mBAAA,EAAuB,MAAA;AAAA,EACvB,qBAAA,EAAuB,UAAA;AAAA,EACvB,mBAAA,EAAuB,MAAA;AAAA,EACvB,qBAAA,EAAuB,UAAA;AAAA,EACvB,oBAAA,EAAuB;AAC3B;AAEO,IAAM,2BAAA,GAAmD;AAAA,EAC5D,IAAA,EAAiB,EAAA;AAAA,EACjB,UAAA,EAAiB,EAAA;AAAA,EACjB,QAAA,EAAiB,EAAA;AAAA,EACjB,cAAA,EAAiB;AACrB;AAEO,IAAM,iBAAA,GAA8B;AAAA,EACvC,cAAA,EAAkB,8BAAA;AAAA,EAClB,MAAA,EAAkB,sBAAA;AAAA,EAClB,SAAA,EAAkB,yBAAA;AAAA,EAClB,SAAA,EAAkB,yBAAA;AAAA,EAClB,QAAA,EAAkB,wBAAA;AAAA,EAClB,SAAA,EAAkB,wBAAA;AAAA,EAClB,gBAAA,EAAkB,gCAAA;AAAA,EAClB,WAAA,EAAkB;AACtB;AAaO,SAAS,gBAAgB,QAAA,EAA4C;AACxE,EAAA,IAAI,CAAC,UAAU,OAAO,iBAAA;AACtB,EAAA,OAAO;AAAA,IACH,gBAAkB,EAAE,GAAG,8BAAA,EAAkC,GAAG,SAAS,cAAA,EAAe;AAAA,IACpF,QAAkB,EAAE,GAAG,sBAAA,EAAkC,GAAG,SAAS,MAAA,EAAO;AAAA,IAC5E,WAAkB,EAAE,GAAG,yBAAA,EAAkC,GAAG,SAAS,SAAA,EAAU;AAAA,IAC/E,WAAkB,EAAE,GAAG,yBAAA,EAAkC,GAAG,SAAS,SAAA,EAAU;AAAA,IAC/E,UAAkB,EAAE,GAAG,wBAAA,EAAkC,GAAG,SAAS,QAAA,EAAS;AAAA,IAC9E,WAAkB,EAAE,GAAG,wBAAA,EAAkC,GAAG,SAAS,SAAA,EAAU;AAAA,IAC/E,kBAAkB,EAAE,GAAG,gCAAA,EAAkC,GAAG,SAAS,gBAAA,EAAiB;AAAA,IACtF,aAAkB,EAAE,GAAG,2BAAA,EAAkC,GAAG,SAAS,WAAA;AAAY,GACrF;AACJ;;;AC1EO,IAAM,cAAA,GAA8B;AAAA,EACvC,MAAA,EAAQ;AAAA,IACJ,MAAA,EAAQ;AAAA,MACJ,WAAA,EAAe,SAAA;AAAA,MACf,MAAA,EAAe,QAAA;AAAA,MACf,IAAA,EAAe,MAAA;AAAA,MACf,IAAA,EAAe,MAAA;AAAA,MACf,IAAA,EAAe,MAAA;AAAA,MACf,UAAA,EAAe,aAAA;AAAA,MACf,aAAA,EAAe,gBAAA;AAAA,MACf,WAAA,EAAe,mBAAA;AAAA,MACf,IAAA,EAAe,WAAA;AAAA,MACf,OAAA,EAAe,UAAA;AAAA,MACf,QAAA,EAAe,UAAA;AAAA,MACf,OAAA,EAAe,SAAA;AAAA,MACf,OAAA,EAAe;AAAA,KACnB;AAAA,IACA,UAAA,EAAY;AAAA,MACR,IAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAO,IAAA;AAAA,MACP,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,KAAA;AAAA,MACP,IAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAO;AAAA,KACX;AAAA,IACA,aAAA,EAAsB,YAAA;AAAA,IACtB,mBAAA,EAAsB,sBAAA;AAAA,IACtB,kBAAA,EAAsB,sBAAA;AAAA,IACtB,qBAAA,EAAsB,mBAAA;AAAA,IACtB,mBAAA,EAAsB,iBAAA;AAAA,IACtB,aAAA,EAAsB,UAAA;AAAA,IACtB,cAAA,EAAsB;AAAA,GAC1B;AAAA,EAEA,SAAA,EAAW;AAAA,IACP,SAAA,EAAW;AAAA,MACP,IAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAO,IAAA;AAAA,MACP,IAAA,EAAO,IAAA;AAAA,MACP,KAAA,EAAO;AAAA;AACX,GACJ;AAAA,EAEA,cAAA,EAAgB;AAAA,IACZ,UAAA,EAAY;AAAA,MACR,UAAA,EAAiB,wBAAA;AAAA,MACjB,SAAA,EAAiB,wBAAA;AAAA,MACjB,MAAA,EAAiB,kBAAA;AAAA,MACjB,YAAA,EAAiB,mBAAA;AAAA,MACjB,UAAA,EAAiB,iBAAA;AAAA,MACjB,MAAA,EAAiB,4BAAA;AAAA,MACjB,WAAA,EAAiB,kBAAA;AAAA,MACjB,QAAA,EAAiB,qBAAA;AAAA,MACjB,OAAA,EAAiB,oBAAA;AAAA,MACjB,OAAA,EAAiB,qBAAA;AAAA,MACjB,QAAA,EAAiB,gBAAA;AAAA,MACjB,eAAA,EAAiB;AAAA,KACrB;AAAA,IACA,KAAA,EAAO;AAAA,MACH,cAAA,EAAoB,iBAAA;AAAA,MACpB,YAAA,EAAoB,eAAA;AAAA,MACpB,SAAA,EAAoB,YAAA;AAAA,MACpB,UAAA,EAAoB,aAAA;AAAA,MACpB,SAAA,EAAoB,YAAA;AAAA,MACpB,eAAA,EAAoB,kBAAA;AAAA,MACpB,WAAA,EAAoB,yBAAA;AAAA,MACpB,eAAA,EAAoB,kBAAA;AAAA,MACpB,cAAA,EAAoB,uBAAA;AAAA,MACpB,YAAA,EAAoB,qBAAA;AAAA,MACpB,UAAA,EAAoB,mBAAA;AAAA,MACpB,WAAA,EAAoB,oBAAA;AAAA,MACpB,UAAA,EAAoB,mBAAA;AAAA,MACpB,SAAA,EAAoB,kBAAA;AAAA,MACpB,MAAA,EAAoB,gCAAA;AAAA,MACpB,aAAA,EAAoB,sBAAA;AAAA,MACpB,OAAA,EAAoB,UAAA;AAAA,MACpB,UAAA,EAAoB,aAAA;AAAA,MACpB,OAAA,EAAoB,UAAA;AAAA,MACpB,SAAA,EAAoB,WAAA;AAAA,MACpB,gBAAA,EAAoB,mBAAA;AAAA,MACpB,OAAA,EAAoB,SAAA;AAAA,MACpB,QAAA,EAAoB,UAAA;AAAA,MACpB,MAAA,EAAoB,QAAA;AAAA,MACpB,GAAA,EAAoB,KAAA;AAAA,MACpB,QAAA,EAAoB,UAAA;AAAA,MACpB,IAAA,EAAoB,MAAA;AAAA,MACpB,UAAA,EAAoB,aAAA;AAAA,MACpB,SAAA,EAAoB,YAAA;AAAA,MACpB,cAAA,EAAoB,oBAAA;AAAA,MACpB,KAAA,EAAoB,OAAA;AAAA,MACpB,SAAA,EAAoB,WAAA;AAAA,MACpB,eAAA,EAAoB,kBAAA;AAAA,MACpB,cAAA,EAAoB,2BAAA;AAAA,MACpB,eAAA,EAAoB,kBAAA;AAAA,MACpB,YAAA,EAAoB,4BAAA;AAAA,MACpB,UAAA,EAAoB,yBAAA;AAAA,MACpB,aAAA,EAAoB,gBAAA;AAAA,MACpB,eAAA,EAAoB,kBAAA;AAAA,MACpB,IAAA,EAAoB,MAAA;AAAA,MACpB,OAAA,EAAoB,SAAA;AAAA,MACpB,UAAA,EAAoB,aAAA;AAAA,MACpB,WAAA,EAAoB,cAAA;AAAA,MACpB,IAAA,EAAoB,MAAA;AAAA,MACpB,SAAA,EAAoB,YAAA;AAAA,MACpB,YAAA,EAAoB,eAAA;AAAA,MACpB,OAAA,EAAoB,UAAA;AAAA,MACpB,SAAA,EAAoB,YAAA;AAAA,MACpB,aAAA,EAAoB,kBAAA;AAAA,MACpB,eAAA,EAAoB,kBAAA;AAAA,MACpB,WAAA,EAAoB,kBAAA;AAAA,MACpB,WAAA,EAAoB,cAAA;AAAA,MACpB,aAAA,EAAoB,gBAAA;AAAA,MACpB,gBAAA,EAAoB,mBAAA;AAAA,MACpB,UAAA,EAAoB,aAAA;AAAA,MACpB,cAAA,EAAoB,iBAAA;AAAA,MACpB,WAAA,EAAoB,cAAA;AAAA,MACpB,YAAA,EAAoB,eAAA;AAAA,MACpB,cAAA,EAAoB,yBAAA;AAAA,MACpB,iBAAA,EAAoB,0BAAA;AAAA,MACpB,eAAA,EAAoB,uBAAA;AAAA,MACpB,kBAAA,EAAoB,0BAAA;AAAA,MACpB,UAAA,EAAoB,4BAAA;AAAA,MACpB,KAAA,EAAoB,OAAA;AAAA,MACpB,WAAA,EAAoB,aAAA;AAAA,MACpB,SAAA,EAAoB,YAAA;AAAA,MACpB,UAAA,EAAoB,YAAA;AAAA,MACpB,QAAA,EAAoB,WAAA;AAAA,MACpB,WAAA,EAAoB,cAAA;AAAA,MACpB,UAAA,EAAoB,aAAA;AAAA,MACpB,eAAA,EAAoB;AAAA,KACxB;AAAA,IACA,OAAA,EAAS;AAAA,MACL,IAAA,EAAgB,eAAA;AAAA,MAChB,IAAA,EAAgB,eAAA;AAAA,MAChB,cAAA,EAAgB,uBAAA;AAAA,MAChB,QAAA,EAAgB,WAAA;AAAA,MAChB,OAAA,EAAgB,UAAA;AAAA,MAChB,OAAA,EAAgB,UAAA;AAAA,MAChB,OAAA,EAAgB,UAAA;AAAA,MAChB,SAAA,EAAgB,YAAA;AAAA,MAChB,WAAA,EAAgB;AAAA,KACpB;AAAA,IACA,SAAA,EAAa,MAAA;AAAA,IACb,QAAA,EAAa,WAAA;AAAA,IACb,UAAA,EAAa;AAAA,GACjB;AAAA,EAEA,IAAA,EAAM;AAAA,IACF,IAAA,EAAQ,GAAA;AAAA,IACR,IAAA,EAAQ,GAAA;AAAA,IACR,GAAA,EAAQ,GAAA;AAAA,IACR,KAAA,EAAQ,GAAA;AAAA,IACR,MAAA,EAAQ;AAAA,GACZ;AAAA,EAEA,KAAA,EAAO;AAAA,IACH,GAAA,EAAgB,KAAA;AAAA,IAChB,IAAA,EAAgB,MAAA;AAAA,IAChB,KAAA,EAAgB,OAAA;AAAA,IAChB,IAAA,EAAgB,MAAA;AAAA,IAChB,MAAA,EAAgB,QAAA;AAAA,IAChB,EAAA,EAAgB,IAAA;AAAA,IAChB,GAAA,EAAgB,KAAA;AAAA,IAChB,eAAA,EAAgB;AAAA,GACpB;AAAA,EAEA,OAAA,EAAS;AAAA,IACL,QAAA,EAAU;AAAA,MACN,KAAA,EAAqB,gBAAA;AAAA,MACrB,UAAA,EAAqB,mBAAA;AAAA,MACrB,SAAA,EAAqB,MAAA;AAAA,MACrB,kBAAA,EAAqB,gBAAA;AAAA,MACrB,OAAA,EAAqB,KAAA;AAAA,MACrB,aAAA,EAAqB,gBAAA;AAAA,MACrB,UAAA,EAAqB,aAAA;AAAA,MACrB,QAAA,EAAqB,MAAA;AAAA,MACrB,SAAA,EAAqB,WAAA;AAAA,MACrB,QAAA,EAAqB,KAAA;AAAA,MACrB,QAAA,EAAqB;AAAA,KACzB;AAAA,IACA,SAAA,EAAW;AAAA,MACP,WAAA,EAAa,UAAA;AAAA,MACb,QAAA,EAAa;AAAA;AACjB,GACJ;AAAA,EAEA,KAAA,EAAO;AAAA,IACH,OAAA,EAAgB,eAAA;AAAA;AAAA,IAChB,MAAA,EAAgB,mBAAA;AAAA,IAChB,cAAA,EAAgB,kBAAA;AAAA,IAChB,WAAA,EAAgB;AAAA;AAExB;AAaO,SAAS,cAAc,QAAA,EAAkD;AAC5E,EAAA,IAAI,CAAC,UAAU,OAAO,cAAA;AAEtB,EAAA,MAAM,IAAA,GAAO,cAAA;AAEb,EAAA,OAAO;AAAA,IACH,MAAA,EAAQ;AAAA,MACJ,GAAG,IAAA,CAAK,MAAA;AAAA,MACR,GAAG,QAAA,CAAS,MAAA;AAAA,MACZ,MAAA,EAAY,EAAE,GAAG,IAAA,CAAK,OAAO,MAAA,EAAY,GAAG,QAAA,CAAS,MAAA,EAAQ,MAAA,EAAO;AAAA,MACpE,UAAA,EAAY,EAAE,GAAG,IAAA,CAAK,OAAO,UAAA,EAAY,GAAG,QAAA,CAAS,MAAA,EAAQ,UAAA;AAAW,KAC5E;AAAA,IACA,SAAA,EAAW;AAAA,MACP,SAAA,EAAW,EAAE,GAAG,IAAA,CAAK,UAAU,SAAA,EAAW,GAAG,QAAA,CAAS,SAAA,EAAW,SAAA;AAAU,KAC/E;AAAA,IACA,cAAA,EAAgB;AAAA,MACZ,GAAG,IAAA,CAAK,cAAA;AAAA,MACR,GAAG,QAAA,CAAS,cAAA;AAAA,MACZ,UAAA,EAAY,EAAE,GAAG,IAAA,CAAK,eAAe,UAAA,EAAY,GAAG,QAAA,CAAS,cAAA,EAAgB,UAAA,EAAW;AAAA,MACxF,KAAA,EAAY,EAAE,GAAG,IAAA,CAAK,eAAe,KAAA,EAAY,GAAG,QAAA,CAAS,cAAA,EAAgB,KAAA,EAAM;AAAA,MACnF,OAAA,EAAY,EAAE,GAAG,IAAA,CAAK,eAAe,OAAA,EAAY,GAAG,QAAA,CAAS,cAAA,EAAgB,OAAA;AAAQ,KACzF;AAAA,IACA,MAAO,EAAE,GAAG,KAAK,IAAA,EAAO,GAAG,SAAS,IAAA,EAAK;AAAA,IACzC,OAAO,EAAE,GAAG,KAAK,KAAA,EAAO,GAAG,SAAS,KAAA,EAAM;AAAA,IAC1C,OAAA,EAAS;AAAA,MACL,QAAA,EAAW,EAAE,GAAG,IAAA,CAAK,QAAQ,QAAA,EAAW,GAAG,QAAA,CAAS,OAAA,EAAS,QAAA,EAAS;AAAA,MACtE,SAAA,EAAW,EAAE,GAAG,IAAA,CAAK,QAAQ,SAAA,EAAW,GAAG,QAAA,CAAS,OAAA,EAAS,SAAA;AAAU,KAC3E;AAAA,IACA,OAAO,EAAE,GAAG,KAAK,KAAA,EAAO,GAAG,SAAS,KAAA;AAAM,GAC9C;AACJ;;;AC5aO,IAAM,WAAA,GAAN,MAAM,WAAA,CAAW;AAAA,EAwBtB,WAAA,CACmB,MAAA,EACT,WAAA,EACA,WAAA,EACA,SAAA,EACA,QAAA,EAEA,QAAA,GAA0B,MAAM,KAAA,EAEhC,IAAA,EACA,WAAA,EACA,SAAA,EACR,eAAA,EACA;AAZiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACT,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAEA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAEA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAlCV,IAAA,IAAA,CAAQ,UAAA,GAAa,KAAA;AACrB,IAAA,IAAA,CAAQ,WAAA,GAAc,KAAA;AACtB,IAAA,IAAA,CAAQ,KAAA,GAAQ,CAAA;AAChB,IAAA,IAAA,CAAQ,KAAA,GAAQ,CAAA;AAChB,IAAA,IAAA,CAAQ,UAAA,GAAa,CAAA;AACrB,IAAA,IAAA,CAAQ,UAAA,GAAa,CAAA;AACrB,IAAA,IAAA,CAAQ,SAAA,GAAY,KAAA;AACpB,IAAA,IAAA,CAAQ,cAAA,GAAiB,KAAA;AAUzB;AAAA,IAAA,IAAA,CAAiB,aAA+C,EAAC;AAIjE;AAAA,IAAA,IAAA,CAAQ,cAAA,GAAgC,IAAA;AAmDxC,IAAA,IAAA,CAAQ,WAAA,GAAc,CAAC,CAAA,KAAkB;AACvC,MAAA,IAAA,CAAK,aAAA,EAAc;AACnB,MAAA,IAAI,IAAA,CAAK,UAAS,EAAG;AACrB,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,MAAA,IAAA,CAAK,QAAQ,CAAA,CAAE,OAAA;AACf,MAAA,IAAA,CAAK,QAAQ,CAAA,CAAE,OAAA;AACf,MAAA,IAAA,CAAK,aAAa,CAAA,CAAE,OAAA;AACpB,MAAA,IAAA,CAAK,aAAa,CAAA,CAAE,OAAA;AACpB,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,MAAA,IAAA,CAAK,WAAW,MAAA,GAAS,CAAA;AAAA,IAC3B,CAAA;AAEA,IAAA,IAAA,CAAQ,YAAA,GAAe,CAAC,CAAA,KAAkB;AAExC,MAAA,IAAI,CAAA,CAAE,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAC1B,QAAA,IAAA,CAAK,aAAA,EAAc;AACnB,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,aAAA,EAAc;AACnB,MAAA,IAAI,IAAA,CAAK,UAAS,EAAG;AACrB,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,MAAA,IAAA,CAAK,KAAA,GAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAA;AAC1B,MAAA,IAAA,CAAK,KAAA,GAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAA;AAC1B,MAAA,IAAA,CAAK,UAAA,GAAa,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAA;AAC/B,MAAA,IAAA,CAAK,UAAA,GAAa,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAA;AAC/B,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,MAAA,IAAA,CAAK,WAAW,MAAA,GAAS,CAAA;AACzB,MAAA,IAAA,CAAK,WAAA,IAAc;AAAA,IACrB,CAAA;AAEA,IAAA,IAAA,CAAQ,WAAA,GAAc,CAAC,CAAA,KAAkB;AACvC,MAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACtB,MAAA,IAAI,IAAA,CAAK,UAAS,EAAG;AAAE,QAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAAO,QAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAAO,QAAA;AAAA,MAAQ;AAChF,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,KAAA;AAChC,MAAA,MAAM,MAAA,GAAS,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,KAAA;AAChC,MAAA,IAAA,CAAK,QAAQ,CAAA,CAAE,OAAA;AACf,MAAA,IAAA,CAAK,QAAQ,CAAA,CAAE,OAAA;AACf,MAAA,MAAM,cAAc,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,OAAA,GAAU,KAAK,UAAU,CAAA;AACxD,MAAA,MAAM,cAAc,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,OAAA,GAAU,KAAK,UAAU,CAAA;AACxD,MAAA,IAAI,CAAC,KAAK,SAAA,KAAc,WAAA,GAAc,YAAW,cAAA,IAAkB,WAAA,GAAc,YAAW,cAAA,CAAA,EAAiB;AAC3G,QAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,QAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,QAAA,IAAA,CAAK,WAAA,IAAc;AACnB,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,MAAA,GAAS,UAAA;AAAA,MAC7B;AACA,MAAA,IAAI,KAAK,SAAA,EAAW;AAClB,QAAA,IAAA,CAAK,qBAAA,CAAsB,MAAA,EAAQ,WAAA,CAAY,GAAA,EAAK,CAAA;AACpD,QAAA,IAAA,CAAK,IAAI,MAAM,CAAA;AACf,QAAA,IAAI,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAAA,MACjC;AAAA,IACF,CAAA;AAEA,IAAA,IAAA,CAAQ,WAAA,GAAc,CAAC,CAAA,KAAkB;AACvC,MAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,CAAA,CAAE,OAAA,CAAQ,WAAW,CAAA,EAAG;AAChD,MAAA,IAAI,IAAA,CAAK,UAAS,EAAG;AAAE,QAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAAO,QAAA;AAAA,MAAQ;AACxD,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,MAAM,SAAS,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAE,UAAU,IAAA,CAAK,KAAA;AAC3C,MAAA,MAAM,SAAS,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAE,UAAU,IAAA,CAAK,KAAA;AAC3C,MAAA,IAAA,CAAK,qBAAA,CAAsB,MAAA,EAAQ,WAAA,CAAY,GAAA,EAAK,CAAA;AACpD,MAAA,IAAA,CAAK,IAAI,MAAM,CAAA;AACf,MAAA,IAAI,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAC/B,MAAA,IAAA,CAAK,KAAA,GAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAA;AAC1B,MAAA,IAAA,CAAK,KAAA,GAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAA;AAAA,IAC5B,CAAA;AAEA,IAAA,IAAA,CAAQ,YAAY,MAAM;AACxB,MAAA,IAAI,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,MAAM,MAAA,GAAS,WAAA;AAC/C,MAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,MAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAEjB,MAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,QAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AACtB,QAAA,MAAM,QAAA,GAAW,KAAK,uBAAA,EAAwB;AAC9C,QAAA,IAAA,CAAK,WAAW,MAAA,GAAS,CAAA;AACzB,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAA;AAG7C,QAAA,IAAI,CAAC,QAAA,EAAU,IAAA,CAAK,SAAA,IAAY;AAAA,MAClC;AAAA,IACF,CAAA;AApHE,IAAA,IAAA,CAAK,gBAAA,GAAoB,iBAAiB,OAAA,IAAa,IAAA;AACvD,IAAA,IAAA,CAAK,cAAA,GAAoB,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,IAAI,GAAA,EAAM,eAAA,EAAiB,KAAA,IAAY,IAAI,CAAC,CAAA;AACzF,IAAA,IAAA,CAAK,kBAAA,GAAqB,iBAAiB,SAAA,IAAc,GAAA;AACzD,IAAA,IAAA,CAAK,oBAAA,GAAuB,iBAAiB,WAAA,IAAe,CAAA;AAC5D,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAEQ,MAAA,GAAe;AACrB,IAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,WAAA,EAAa,IAAA,CAAK,WAAW,CAAA;AAC1D,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAA,EAAa,IAAA,CAAK,WAAW,CAAA;AACrD,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAA,EAAW,IAAA,CAAK,SAAS,CAAA;AAGjD,IAAA,IAAA,CAAK,MAAA,CAAO,iBAAiB,YAAA,EAAc,IAAA,CAAK,cAAc,EAAE,OAAA,EAAS,OAAO,CAAA;AAChF,IAAA,MAAA,CAAO,iBAAiB,WAAA,EAAa,IAAA,CAAK,aAAa,EAAE,OAAA,EAAS,OAAO,CAAA;AACzE,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAA,EAAY,IAAA,CAAK,SAAS,CAAA;AAAA,EACpD;AAAA;AAAA,EAGA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AAAA,EACnB;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,WAAA,EAAa,IAAA,CAAK,WAAW,CAAA;AAC7D,IAAA,MAAA,CAAO,mBAAA,CAAoB,WAAA,EAAa,IAAA,CAAK,WAAW,CAAA;AACxD,IAAA,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,IAAA,CAAK,SAAS,CAAA;AACpD,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,YAAA,EAAc,IAAA,CAAK,YAAY,CAAA;AAC/D,IAAA,MAAA,CAAO,mBAAA,CAAoB,WAAA,EAAa,IAAA,CAAK,WAAW,CAAA;AACxD,IAAA,MAAA,CAAO,mBAAA,CAAoB,UAAA,EAAY,IAAA,CAAK,SAAS,CAAA;AAAA,EACvD;AAAA;AAAA,EAuFQ,qBAAA,CAAsB,IAAY,CAAA,EAAiB;AACzD,IAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,EAAE,EAAA,EAAI,GAAG,CAAA;AAE9B,IAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAW,aAAA;AAC9B,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,OAAO,CAAA,GAAI,KAAK,UAAA,CAAW,MAAA,IAAU,KAAK,UAAA,CAAW,CAAC,CAAA,CAAE,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA;AACpE,IAAA,IAAI,IAAI,CAAA,EAAG,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,EACxC;AAAA,EAEQ,uBAAA,GAAkC;AACxC,IAAA,MAAM,MAAM,IAAA,CAAK,UAAA;AACjB,IAAA,IAAI,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,OAAO,CAAA;AAC3B,IAAA,MAAM,OAAA,GAAU,IAAI,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AACpD,IAAA,MAAM,EAAA,GAAK,IAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,CAAE,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,CAAA;AAC1C,IAAA,IAAI,EAAA,IAAM,GAAG,OAAO,CAAA;AACpB,IAAA,MAAM,MAAM,OAAA,GAAU,EAAA;AACtB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG,IAAA,CAAK,oBAAoB,CAAA;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,eAAe,QAAA,EAA2B;AAChD,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,EAAkB,OAAO,KAAA;AACnC,IAAA,IAAI,KAAK,GAAA,CAAI,QAAQ,CAAA,GAAI,IAAA,CAAK,oBAAoB,OAAO,KAAA;AAEzD,IAAA,IAAI,QAAA,GAA0B,IAAA;AAC9B,IAAA,IAAI,GAAA,GAAM,QAAA;AACV,IAAA,MAAM,QAAQ,IAAA,CAAK,cAAA;AAEnB,IAAA,MAAM,IAAA,GAAO,CAAC,GAAA,KAAgB;AAC5B,MAAA,IAAI,aAAa,IAAA,EAAM;AAAE,QAAA,QAAA,GAAW,GAAA;AAAK,QAAA,IAAA,CAAK,cAAA,GAAiB,sBAAsB,IAAI,CAAA;AAAG,QAAA;AAAA,MAAQ;AAEpG,MAAA,MAAM,KAAK,GAAA,GAAM,QAAA;AACjB,MAAA,QAAA,GAAW,GAAA;AAGX,MAAA,GAAA,IAAO,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,EAAA,GAAK,KAAK,CAAA;AAEjC,MAAA,MAAM,aAAa,GAAA,GAAM,EAAA;AAGzB,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,GAAI,GAAA,EAAK;AAC9B,QAAA,IAAA,CAAK,aAAA,EAAc;AACnB,QAAA,IAAA,CAAK,SAAA,IAAY;AACjB,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,IAAA,CAAK,UAAS,EAAG;AACnB,QAAA,IAAA,CAAK,aAAA,EAAc;AACnB,QAAA,IAAA,CAAK,SAAA,IAAY;AACjB,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,WAAA,EAAY,CAAE,UAAA;AACrC,MAAA,IAAA,CAAK,IAAI,UAAU,CAAA;AACnB,MAAA,IAAI,IAAA,CAAK,WAAA,EAAY,CAAE,UAAA,KAAe,SAAA,EAAW;AAC/C,QAAA,IAAA,CAAK,aAAA,EAAc;AACnB,QAAA,IAAA,CAAK,SAAA,IAAY;AACjB,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,cAAA,GAAiB,sBAAsB,IAAI,CAAA;AAAA,IAClD,CAAA;AAEA,IAAA,IAAA,CAAK,cAAA,GAAiB,sBAAsB,IAAI,CAAA;AAChD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,IAAI,IAAA,CAAK,mBAAmB,IAAA,EAAM;AAChC,MAAA,oBAAA,CAAqB,KAAK,cAAc,CAAA;AACxC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IACxB;AAAA,EACF;AAAA;AAAA,EAIQ,IAAI,MAAA,EAAsB;AAChC,IAAA,MAAM,EAAA,GAAK,KAAK,WAAA,EAAY;AAC5B,IAAA,MAAM,WAAA,GAAc,EAAA,CAAG,QAAA,GAAW,EAAA,CAAG,UAAA;AACrC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,GACd,IAAA,CAAK,MAAA,CAAO,WAAA,IAAe,IAAA,CAAK,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,gBAAA,IAAoB,CAAA,CAAA,GAC5E,KAAK,MAAA,CAAO,KAAA;AAChB,IAAA,MAAM,eAAe,WAAA,GAAc,KAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,GAAS,YAAA;AAExB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,SAAA,EAAU,GAAI,IAAA,CAAK,KAAA,CAAM,WAAA,GAAc,CAAC,CAAC,CAAA;AAC3E,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,QAAA,EAAU,EAAA,CAAG,UAAA,GAAa,KAAK,CAAC,CAAA;AAEtE,IAAA,IAAA,CAAK,WAAA,CAAY,EAAE,GAAG,EAAA,EAAI,YAAY,QAAA,EAAU,QAAA,EAAU,QAAA,GAAW,WAAA,EAAa,CAAA;AAClF,IAAA,IAAA,CAAK,QAAA,EAAS;AAAA,EAChB;AACF,CAAA;AAhQa,WAAA,CASa,cAAA,GAAiB,CAAA;AAT9B,WAAA,CAmBa,aAAA,GAAgB,GAAA;AAnBnC,IAAM,UAAA,GAAN,WAAA;;;ACrBP,IAAM,gBAAA,GAAmB,EAAA;AACzB,IAAM,gBAAA,GAAmB,GAAA;AAElB,IAAM,cAAN,MAAkB;AAAA,EAKvB,WAAA,CACmB,MAAA,EACT,WAAA,EACA,WAAA,EACA,WACA,QAAA,EACA,aAAA,GAA+B,MAAM,MAAA,CAAO,uBAAsB,EAClE,aAAA,GAA8B,MAAM,MAAA,CAAO,aAC3C,eAAA,EACR;AARiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACT,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AACA,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AACA,IAAA,IAAA,CAAA,eAAA,GAAA,eAAA;AAZV,IAAA,IAAA,CAAQ,eAAA,GAAkB,CAAA;AAC1B,IAAA,IAAA,CAAQ,gBAAA,GAAmB,CAAA;AAC3B,IAAA,IAAA,CAAQ,mBAAA,GAAuC,IAAA;AA6B/C,IAAA,IAAA,CAAQ,OAAA,GAAU,CAAC,CAAA,KAAwB;AACzC,MAAA,CAAA,CAAE,cAAA,EAAe;AAEjB,MAAA,MAAM,EAAA,GAAK,KAAK,WAAA,EAAY;AAC5B,MAAA,MAAM,WAAA,GAAc,EAAA,CAAG,QAAA,GAAW,EAAA,CAAG,UAAA;AAMrC,MAAA,IAAI,UAAA;AACJ,MAAA,IAAI,EAAE,OAAA,EAAS;AAEb,QAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,EAAA,EAAI,CAAA,CAAE,MAAM,CAAC,CAAA;AACpD,QAAA,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,OAAA,GAAU,IAAI,CAAA;AAAA,MACtC,CAAA,MAAO;AAGL,QAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,MAAM,IAAI,GAAA,EAAK;AACnE,UAAA,IAAI,IAAA,CAAK,eAAA,EAAiB,IAAA,CAAK,eAAA,CAAgB,EAAE,MAAM,CAAA;AACvD,UAAA,IAAA,CAAK,QAAA,EAAS;AACd,UAAA;AAAA,QACF;AACA,QAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AACpB,QAAA,UAAA,GAAa,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,GAAA;AAAA,MACpC;AACA,MAAA,MAAM,aAAa,IAAA,CAAK,KAAA;AAAA,QACtB,IAAA,CAAK,IAAI,gBAAA,EAAkB,IAAA,CAAK,IAAI,gBAAA,EAAkB,WAAA,GAAc,UAAU,CAAC;AAAA,OACjF;AAEA,MAAA,IAAI,EAAA,CAAG,QAAA,IAAY,IAAA,CAAK,SAAA,EAAU,EAAG;AAOnC,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,QAAA,EAAU,IAAA,CAAK,SAAA,EAAU,GAAI,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,CAAC,CAAC,CAAA;AAClF,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,UAAU,CAAA;AAChD,QAAA,IAAA,CAAK,WAAA,CAAY,EAAE,GAAG,EAAA,EAAI,YAAY,QAAA,EAAU,QAAA,EAAU,QAAA,GAAW,UAAA,EAAY,CAAA;AAAA,MACnF,CAAA,MAAO;AAIL,QAAA,MAAM,UAAA,GAAa,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,aAAA,EAAc;AAClD,QAAA,MAAM,QAAA,GAAW,EAAA,CAAG,UAAA,GAAa,WAAA,GAAc,UAAA;AAC/C,QAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAA,GAAW,aAAa,UAAU,CAAA;AAC/D,QAAA,IAAA,CAAK,WAAA,CAAY,EAAE,GAAG,EAAA,EAAI,YAAY,QAAA,EAAU,QAAA,EAAU,QAAA,GAAW,UAAA,EAAY,CAAA;AAAA,MACnF;AAEA,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IAChB,CAAA;AAEA,IAAA,IAAA,CAAQ,YAAA,GAAe,CAAC,CAAA,KAAwB;AAC9C,MAAA,IAAI,CAAA,CAAE,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA;AACtD,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,MAAA,IAAA,CAAK,mBAAA,GAAsB,EAAE,GAAG,IAAA,CAAK,aAAY,EAAE;AAEnD,MAAA,MAAM,IAAA,GAAO,KAAK,aAAA,EAAc;AAChC,MAAA,MAAM,UAAA,GAAA,CAAc,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAE,UAAU,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAA,IAAW,CAAA;AACnE,MAAA,MAAM,IAAA,GAAO,aAAa,IAAA,CAAK,IAAA;AAC/B,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,GAAO,IAAA,CAAK,aAAA,EAAe,CAAC,CAAA;AAAA,IAC9E,CAAA;AAEA,IAAA,IAAA,CAAQ,WAAA,GAAc,CAAC,CAAA,KAAwB;AAC7C,MAAA,IAAI,CAAA,CAAE,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAC5B,MAAA,CAAA,CAAE,cAAA,EAAe;AAEjB,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA;AAG7D,MAAA,IAAI,IAAA,CAAK,eAAA,KAAoB,CAAA,IAAK,CAAC,KAAK,mBAAA,EAAqB;AAC3D,QAAA,IAAA,CAAK,eAAA,GAAkB,WAAA;AACvB,QAAA,IAAA,CAAK,mBAAA,GAAsB,EAAE,GAAG,IAAA,CAAK,aAAY,EAAE;AACnD,QAAA,MAAM,IAAA,GAAO,KAAK,aAAA,EAAc;AAChC,QAAA,MAAM,UAAA,GAAA,CAAc,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAE,UAAU,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,CAAE,OAAA,IAAW,CAAA;AACnE,QAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAI,UAAA,GAAa,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,aAAA,EAAe,CAAC,CAAA;AAChG,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,WAAA,GAAc,KAAK,eAAA,GAAkB,WAAA;AAE3C,MAAA,MAAM,KAAK,IAAA,CAAK,mBAAA;AAChB,MAAA,MAAM,gBAAA,GAAmB,EAAA,CAAG,QAAA,GAAW,EAAA,CAAG,UAAA;AAC1C,MAAA,MAAM,aAAa,IAAA,CAAK,KAAA;AAAA,QACtB,IAAA,CAAK,IAAI,gBAAA,EAAkB,IAAA,CAAK,IAAI,gBAAA,EAAkB,gBAAA,GAAmB,WAAW,CAAC;AAAA,OACvF;AAGA,MAAA,MAAM,aAAa,IAAA,CAAK,gBAAA;AACxB,MAAA,MAAM,QAAA,GAAW,EAAA,CAAG,UAAA,GAAa,gBAAA,GAAmB,UAAA;AACpD,MAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAA,GAAW,aAAa,UAAU,CAAA;AAC/D,MAAA,IAAA,CAAK,WAAA,CAAY,EAAE,GAAG,EAAA,EAAI,YAAY,QAAA,EAAU,QAAA,EAAU,QAAA,GAAW,UAAA,EAAY,CAAA;AACjF,MAAA,IAAA,CAAK,QAAA,EAAS;AAAA,IAChB,CAAA;AAEA,IAAA,IAAA,CAAQ,aAAa,MAAY;AAC/B,MAAA,IAAA,CAAK,eAAA,GAAkB,CAAA;AACvB,MAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAAA,IAC7B,CAAA;AAtHE,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EACd;AAAA,EAEQ,MAAA,GAAe;AACrB,IAAA,IAAA,CAAK,MAAA,CAAO,iBAAiB,OAAA,EAAS,IAAA,CAAK,SAAS,EAAE,OAAA,EAAS,OAAO,CAAA;AACtE,IAAA,IAAA,CAAK,MAAA,CAAO,iBAAiB,YAAA,EAAc,IAAA,CAAK,cAAc,EAAE,OAAA,EAAS,OAAO,CAAA;AAChF,IAAA,IAAA,CAAK,MAAA,CAAO,iBAAiB,WAAA,EAAc,IAAA,CAAK,aAAc,EAAE,OAAA,EAAS,OAAO,CAAA;AAChF,IAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,UAAA,EAAc,IAAA,CAAK,UAAU,CAAA;AAAA,EAC5D;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,OAAA,EAAS,IAAA,CAAK,OAAO,CAAA;AACrD,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,YAAA,EAAc,IAAA,CAAK,YAAY,CAAA;AAC/D,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,WAAA,EAAc,IAAA,CAAK,WAAW,CAAA;AAC9D,IAAA,IAAA,CAAK,MAAA,CAAO,mBAAA,CAAoB,UAAA,EAAc,IAAA,CAAK,UAAU,CAAA;AAAA,EAC/D;AAAA,EAyGQ,SAAA,CAAU,IAAW,EAAA,EAAmB;AAC9C,IAAA,MAAM,EAAA,GAAK,EAAA,CAAG,OAAA,GAAU,EAAA,CAAG,OAAA;AAC3B,IAAA,MAAM,EAAA,GAAK,EAAA,CAAG,OAAA,GAAU,EAAA,CAAG,OAAA;AAC3B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AAAA,EACpC;AACF,CAAA;;;AC7IO,SAAS,iBAAA,CACd,KACA,IAAA,EACA,QAAA,EACA,YACA,KAAA,EACA,KAAA,EACA,YACA,WAAA,EACM;AACN,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,eAAA,CAAgB,QAAA,EAAU,UAAU,CAAA;AAC5D,EAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AAGf,EAAA,MAAM,EAAA,GAAU,IAAI,YAAA,CAAa,CAAC,CAAA;AAClC,EAAA,MAAM,MAAA,GAAU,IAAI,YAAA,CAAa,CAAC,CAAA;AAClC,EAAA,MAAM,KAAA,GAAU,IAAI,YAAA,CAAa,CAAC,CAAA;AAClC,EAAA,MAAM,MAAA,GAAU,IAAI,YAAA,CAAa,CAAC,CAAA;AAClC,EAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,CAAC,CAAA;AAClC,EAAA,MAAM,OAAA,GAAU,IAAI,UAAA,CAAW,CAAC,CAAA;AAEhC,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA;AAC/C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,EAAA,CAAG,CAAC,CAAA,GAAS,KAAA,CAAM,SAAS,QAAA,GAAW,CAAA,EAAG,UAAU,UAAU,CAAA;AAC9D,IAAA,MAAA,CAAO,CAAC,CAAA,GAAK,KAAA,CAAM,SAAS,GAAA,CAAI,IAAA,EAAO,YAAY,WAAW,CAAA;AAC9D,IAAA,KAAA,CAAM,CAAC,CAAA,GAAM,KAAA,CAAM,SAAS,GAAA,CAAI,GAAA,EAAO,YAAY,WAAW,CAAA;AAC9D,IAAA,MAAA,CAAO,CAAC,CAAA,GAAK,KAAA,CAAM,SAAS,GAAA,CAAI,IAAA,EAAO,YAAY,WAAW,CAAA;AAC9D,IAAA,OAAA,CAAQ,CAAC,CAAA,GAAI,KAAA,CAAM,SAAS,GAAA,CAAI,KAAA,EAAO,YAAY,WAAW,CAAA;AAC9D,IAAA,OAAA,CAAQ,CAAC,CAAA,GAAI,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,OAAO,CAAA,GAAI,CAAA;AAAA,EAC3C;AAEA,EAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAGhB,EAAA,GAAA,CAAI,WAAA,GAAc,MAAM,MAAA,CAAO,MAAA;AAC/B,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,EAAG;AAAE,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAA;AAAG,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IAAG;AAAA,EAC/E;AACA,EAAA,GAAA,CAAI,MAAA,EAAO;AAGX,EAAA,GAAA,CAAI,WAAA,GAAc,MAAM,MAAA,CAAO,QAAA;AAC/B,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,IAAI,CAAC,OAAA,CAAQ,CAAC,CAAA,EAAG;AAAE,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAA;AAAG,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IAAG;AAAA,EAChF;AACA,EAAA,GAAA,CAAI,MAAA,EAAO;AAGX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,OAAA,GAAc,KAAK,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,CAAA;AAClD,IAAA,MAAM,UAAA,GAAc,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAA,GAAI,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA;AAChE,IAAA,MAAM,IAAA,GAAc,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA;AACnC,IAAA,MAAM,YAAc,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,EAAA,GAAO,MAAM,MAAA,CAAO,IAAA;AAC5D,IAAA,MAAM,WAAA,GAAc,IAAA,GACf,KAAA,CAAM,MAAA,CAAO,QAAA,IAAc,KAAA,CAAM,MAAA,CAAO,EAAA,GACxC,KAAA,CAAM,MAAA,CAAO,UAAA,IAAc,KAAA,CAAM,MAAA,CAAO,IAAA;AAC7C,IAAA,GAAA,CAAI,SAAA,GAAY,SAAA;AAChB,IAAA,GAAA,CAAI,QAAA,CAAS,GAAG,CAAC,CAAA,GAAI,YAAY,CAAA,EAAG,OAAA,EAAS,WAAW,UAAU,CAAA;AAClE,IAAA,IAAI,gBAAgB,SAAA,EAAW;AAC7B,MAAA,GAAA,CAAI,WAAA,GAAc,WAAA;AAClB,MAAA,GAAA,CAAI,SAAA,GAAc,CAAA;AAClB,MAAA,GAAA,CAAI,UAAA,CAAW,GAAG,CAAC,CAAA,GAAI,YAAY,CAAA,EAAG,OAAA,EAAS,WAAW,UAAU,CAAA;AAAA,IACtE;AAAA,EACF;AACF;;;AC9DO,SAAS,kBAAA,CACZ,KACA,IAAA,EACA,QAAA,EACA,YACA,KAAA,EACA,KAAA,EACA,YACA,WAAA,EACI;AACJ,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,eAAA,CAAgB,QAAA,EAAU,UAAU,CAAA;AAC5D,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA;AAE/C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAClC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,MAAM,WAAW,QAAA,GAAW,CAAA;AAC5B,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU,UAAU,UAAU,CAAA;AACvD,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,IAAA;AAE9B,IAAA,MAAM,QAAS,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,IAAA,EAAO,YAAY,WAAW,CAAA;AAChE,IAAA,MAAM,SAAS,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,KAAA,EAAO,YAAY,WAAW,CAAA;AAChE,IAAA,MAAM,QAAS,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,IAAA,EAAO,YAAY,WAAW,CAAA;AAChE,IAAA,MAAM,OAAS,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,GAAA,EAAO,YAAY,WAAW,CAAA;AAEhE,IAAA,MAAM,QAAY,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,EAAA,GAAO,MAAM,MAAA,CAAO,IAAA;AAC1D,IAAA,MAAM,YAAY,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,MAAA,GAAS,MAAM,MAAA,CAAO,QAAA;AAG5D,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,WAAA,GAAc,SAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,KAAK,CAAA;AACnB,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,IAAI,CAAA;AAClB,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,MAAM,OAAA,GAAa,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,MAAM,CAAA;AACzC,IAAA,MAAM,UAAA,GAAa,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,MAAA,GAAS,KAAK,GAAG,CAAC,CAAA;AAEvD,IAAA,IAAI,IAAA,EAAM;AAEN,MAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,MAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,MAAA,GAAA,CAAI,WAAW,CAAA,GAAI,SAAA,GAAY,CAAA,EAAG,OAAA,EAAS,WAAW,UAAU,CAAA;AAAA,IACpE,CAAA,MAAO;AAEH,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,MAAA,CAAO,UAAA,IAAc,MAAM,MAAA,CAAO,IAAA;AAC5D,MAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,MAAA,GAAA,CAAI,SAAS,CAAA,GAAI,SAAA,GAAY,CAAA,EAAG,OAAA,EAAS,WAAW,UAAU,CAAA;AAC9D,MAAA,IAAI,gBAAgB,KAAA,EAAO;AACvB,QAAA,GAAA,CAAI,WAAA,GAAc,WAAA;AAClB,QAAA,GAAA,CAAI,SAAA,GAAc,CAAA;AAClB,QAAA,GAAA,CAAI,WAAW,CAAA,GAAI,SAAA,GAAY,CAAA,EAAG,OAAA,EAAS,WAAW,UAAU,CAAA;AAAA,MACpE;AAAA,IACJ;AAAA,EACJ;AACJ;;;AC7DA,SAAS,SAAA,CAAU,OAAe,KAAA,EAAuB;AAEvD,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,yCAAyC,CAAA;AACtE,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,CAAA,KAAA,EAAQ,QAAA,CAAS,CAAC,CAAC,CAAA,CAAA,EAAI,QAAA,CAAS,CAAC,CAAC,CAAA,CAAA,EAAI,QAAA,CAAS,CAAC,CAAC,IAAI,KAAK,CAAA,CAAA,CAAA;AAAA,EACnE;AAEA,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA;AAC/B,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,MAAA,KAAW,CAAA,GAAI,EAAE,KAAA,CAAM,EAAE,CAAA,CAAE,GAAA,CAAI,OAAK,CAAA,GAAI,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,GAAI,CAAA;AAClE,EAAA,MAAM,IAAI,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACpC,EAAA,MAAM,IAAI,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACpC,EAAA,MAAM,IAAI,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACpC,EAAA,OAAO,QAAQ,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,KAAK,CAAA,CAAA,CAAA;AACrC;AAGA,IAAI,UAAA,GAA+B,IAAA;AAE5B,SAAS,UAAA,CACd,GAAA,EACA,IAAA,EACA,QAAA,EACA,UAAA,EACA,OACA,KAAA,EACA,UAAA,EACA,WAAA,EACA,IAAA,GAAO,KAAA,EACD;AACN,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AAEvB,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA;AAG/C,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,MAAM,KAAA,GAAS,MAAM,QAAA,CAAS,QAAA,GAAW,KAAK,MAAA,GAAS,CAAA,EAAG,UAAU,UAAU,CAAA;AAC9E,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU,UAAU,UAAU,CAAA;AAE5D,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,QAAA,GAAW,CAAA,EAAG,UAAU,UAAU,CAAA;AAC3D,MAAA,MAAM,CAAA,GAAI,MAAM,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,CAAE,KAAA,EAAO,YAAY,WAAW,CAAA;AAC/D,MAAA,CAAA,KAAM,CAAA,GAAI,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA;AAAA,IAC9C;AACA,IAAA,GAAA,CAAI,MAAA,CAAO,OAAO,WAAW,CAAA;AAC7B,IAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,WAAW,CAAA;AAC9B,IAAA,GAAA,CAAI,SAAA,EAAU;AAEd,IAAA,IAAI,CAAC,cAAc,UAAA,CAAW,MAAA,KAAW,eAAe,UAAA,CAAW,KAAA,KAAU,KAAA,CAAM,MAAA,CAAO,EAAA,EAAI;AAC5F,MAAA,MAAM,OAAO,GAAA,CAAI,oBAAA,CAAqB,CAAA,EAAG,CAAA,EAAG,GAAG,WAAW,CAAA;AAC1D,MAAA,IAAA,CAAK,aAAa,CAAA,EAAG,SAAA,CAAU,MAAM,MAAA,CAAO,EAAA,EAAI,IAAI,CAAC,CAAA;AACrD,MAAA,IAAA,CAAK,aAAa,CAAA,EAAG,SAAA,CAAU,MAAM,MAAA,CAAO,EAAA,EAAI,CAAC,CAAC,CAAA;AAClD,MAAA,UAAA,GAAa,EAAE,UAAU,IAAA,EAAM,MAAA,EAAQ,aAAa,KAAA,EAAO,KAAA,CAAM,OAAO,EAAA,EAAG;AAAA,IAC7E;AACA,IAAA,GAAA,CAAI,YAAY,UAAA,CAAW,QAAA;AAC3B,IAAA,GAAA,CAAI,IAAA,EAAK;AAAA,EACX;AAGA,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,WAAA,GAAc,MAAM,MAAA,CAAO,EAAA;AAC/B,EAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,EAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AAEf,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,QAAA,GAAW,CAAA,EAAG,UAAU,UAAU,CAAA;AAC3D,IAAA,MAAM,CAAA,GAAI,MAAM,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,CAAE,KAAA,EAAO,YAAY,WAAW,CAAA;AAC/D,IAAA,CAAA,KAAM,CAAA,GAAI,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA;AAAA,EAC9C;AAEA,EAAA,GAAA,CAAI,MAAA,EAAO;AACb;;;ACvEO,SAAS,UAAA,CACd,KACA,IAAA,EACA,QAAA,EACA,YACA,KAAA,EACA,KAAA,EACA,YACA,WAAA,EACM;AACN,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAG,MAAM,eAAA,CAAgB,QAAA,EAAU,UAAU,CAAA,GAAI,GAAG,CAAA;AAC/E,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA;AAE/C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,MAAM,WAAW,QAAA,GAAW,CAAA;AAC5B,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU,UAAU,UAAU,CAAA;AACvD,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,IAAA;AAC9B,IAAA,MAAM,QAAQ,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,EAAA,GAAK,MAAM,MAAA,CAAO,IAAA;AAEpD,IAAA,MAAM,QAAQ,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,IAAA,EAAM,YAAY,WAAW,CAAA;AAC9D,IAAA,MAAM,SAAS,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,KAAA,EAAO,YAAY,WAAW,CAAA;AAChE,IAAA,MAAM,QAAQ,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,IAAA,EAAM,YAAY,WAAW,CAAA;AAC9D,IAAA,MAAM,OAAO,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,GAAA,EAAK,YAAY,WAAW,CAAA;AAE5D,IAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAGhB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,KAAK,CAAA;AACnB,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,IAAI,CAAA;AAClB,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,SAAA,EAAW,KAAK,CAAA;AAC/B,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,KAAK,CAAA;AACnB,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,MAAM,CAAA;AACpB,IAAA,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,SAAA,EAAW,MAAM,CAAA;AAChC,IAAA,GAAA,CAAI,MAAA,EAAO;AAAA,EACb;AACF;;;AC9CO,SAAS,YAAA,CACd,KACA,IAAA,EACA,QAAA,EACA,WACA,KAAA,EACA,KAAA,EACA,UAAA,EACA,WAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,eAAA,CAAgB,QAAA,EAAU,UAAU,CAAA;AAC5D,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA;AAE/C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,GAAA,CAAI,UAAU,IAAA,EAAM;AAExB,IAAA,MAAM,WAAW,QAAA,GAAW,CAAA;AAC5B,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU,UAAU,UAAU,CAAA;AACvD,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,IAAA;AAE9B,IAAA,MAAM,YAAY,WAAA,GAAc,KAAA,CAAM,cAAc,GAAA,CAAI,MAAA,EAAQ,WAAW,WAAW,CAAA;AACtF,IAAA,MAAM,CAAA,GAAI,UAAU,WAAA,GAAc,SAAA;AAElC,IAAA,GAAA,CAAI,YAAY,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,EAAA,GAAK,MAAM,MAAA,CAAO,IAAA;AACtD,IAAA,GAAA,CAAI,SAAS,CAAA,GAAI,SAAA,GAAY,CAAA,EAAG,CAAA,EAAG,WAAW,SAAS,CAAA;AAAA,EACzD;AACF;;;AC5BA,SAAS,kBAAkB,IAAA,EAA8B;AACrD,EAAA,MAAM,MAAkB,EAAC;AACzB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAClC,IAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,IAAA,MAAM,OAAA,GAAA,CAAW,EAAE,IAAA,GAAO,CAAA,CAAE,OAAO,CAAA,CAAE,GAAA,GAAM,EAAE,KAAA,IAAS,CAAA;AACtD,IAAA,MAAM,SAAU,CAAA,KAAM,CAAA,GAAA,CACf,CAAA,CAAE,IAAA,GAAO,EAAE,KAAA,IAAS,CAAA,GAAA,CACpB,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,CAAE,IAAA,GAAO,IAAI,CAAA,GAAI,CAAC,EAAE,KAAA,IAAS,CAAA;AAC7C,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA,MACL,MAAQ,CAAA,CAAE,IAAA;AAAA,MACV,IAAA,EAAQ,MAAA;AAAA,MACR,KAAA,EAAQ,OAAA;AAAA,MACR,MAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,IAAA,EAAM,QAAQ,OAAO,CAAA;AAAA,MACxC,KAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,GAAA,EAAM,QAAQ,OAAO,CAAA;AAAA,MACxC,QAAQ,CAAA,CAAE;AAAA,KACb,CAAA;AAAA,EACL;AACA,EAAA,OAAO,GAAA;AACX;AAEO,SAAS,gBAAA,CACZ,KACA,IAAA,EACA,QAAA,EACA,YACA,KAAA,EACA,KAAA,EACA,YACA,WAAA,EACI;AACJ,EAAA,MAAM,MAAA,GAAY,kBAAkB,IAAI,CAAA;AACxC,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,eAAA,CAAgB,QAAA,EAAU,UAAU,CAAA;AAC5D,EAAA,MAAM,QAAA,GAAY,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA;AAEhD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,GAAA,GAAW,OAAO,CAAC,CAAA;AACzB,IAAA,MAAM,WAAW,QAAA,GAAW,CAAA;AAC5B,IAAA,MAAM,CAAA,GAAW,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU,UAAU,UAAU,CAAA;AAC9D,IAAA,MAAM,IAAA,GAAW,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,IAAA;AAElC,IAAA,MAAM,QAAS,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,IAAA,EAAO,YAAY,WAAW,CAAA;AAChE,IAAA,MAAM,SAAS,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,KAAA,EAAO,YAAY,WAAW,CAAA;AAChE,IAAA,MAAM,QAAS,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,IAAA,EAAO,YAAY,WAAW,CAAA;AAChE,IAAA,MAAM,OAAS,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,GAAA,EAAO,YAAY,WAAW,CAAA;AAEhE,IAAA,MAAM,QAAc,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,EAAA,GAAO,MAAM,MAAA,CAAO,IAAA;AAC5D,IAAA,MAAM,YAAc,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,MAAA,GAAS,MAAM,MAAA,CAAO,QAAA;AAC9D,IAAA,MAAM,WAAA,GAAc,IAAA,GACb,KAAA,CAAM,MAAA,CAAO,QAAA,IAAc,KAAA,CAAM,MAAA,CAAO,EAAA,GACxC,KAAA,CAAM,MAAA,CAAO,UAAA,IAAc,KAAA,CAAM,MAAA,CAAO,IAAA;AAG/C,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,WAAA,GAAc,SAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAc,CAAA;AAClB,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,KAAK,CAAA;AACnB,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,IAAI,CAAA;AAClB,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,MAAM,OAAA,GAAa,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,MAAM,CAAA;AACzC,IAAA,MAAM,UAAA,GAAa,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,MAAA,GAAS,KAAK,GAAG,CAAC,CAAA;AAEvD,IAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,IAAA,GAAA,CAAI,SAAS,CAAA,GAAI,SAAA,GAAY,CAAA,EAAG,OAAA,EAAS,WAAW,UAAU,CAAA;AAC9D,IAAA,IAAI,gBAAgB,KAAA,EAAO;AACvB,MAAA,GAAA,CAAI,WAAA,GAAc,WAAA;AAClB,MAAA,GAAA,CAAI,SAAA,GAAc,CAAA;AAClB,MAAA,GAAA,CAAI,WAAW,CAAA,GAAI,SAAA,GAAY,CAAA,EAAG,OAAA,EAAS,WAAW,UAAU,CAAA;AAAA,IACpE;AAAA,EACJ;AACJ;;;ACvEO,SAAS,mBAAA,CACZ,KACA,IAAA,EACA,QAAA,EACA,YACA,KAAA,EACA,KAAA,EACA,YACA,WAAA,EACI;AACJ,EAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,eAAA,CAAgB,QAAA,EAAU,UAAU,CAAA;AAChE,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,IAAU,CAAC,CAAA,EAAG,CAAC,CAAA;AAC1D,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA;AAE/C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAClC,IAAA,MAAM,GAAA,GAAW,KAAK,CAAC,CAAA;AACvB,IAAA,MAAM,WAAW,QAAA,GAAW,CAAA;AAC5B,IAAA,MAAM,CAAA,GAAW,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU,UAAU,UAAU,CAAA;AAC9D,IAAA,MAAM,IAAA,GAAW,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,IAAA;AAGlC,IAAA,MAAM,WAAY,MAAA,GAAS,CAAA,GAAA,CAAK,GAAA,CAAI,MAAA,IAAU,UAAU,MAAA,GAAS,CAAA;AACjE,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,WAAW,aAAa,CAAA;AAEtD,IAAA,MAAM,QAAS,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,IAAA,EAAO,YAAY,WAAW,CAAA;AAChE,IAAA,MAAM,SAAS,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,KAAA,EAAO,YAAY,WAAW,CAAA;AAChE,IAAA,MAAM,QAAS,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,IAAA,EAAO,YAAY,WAAW,CAAA;AAChE,IAAA,MAAM,OAAS,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,GAAA,EAAO,YAAY,WAAW,CAAA;AAEhE,IAAA,MAAM,QAAc,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,EAAA,GAAO,MAAM,MAAA,CAAO,IAAA;AAC5D,IAAA,MAAM,YAAc,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,MAAA,GAAS,MAAM,MAAA,CAAO,QAAA;AAC9D,IAAA,MAAM,WAAA,GAAc,IAAA,GACb,KAAA,CAAM,MAAA,CAAO,QAAA,IAAc,KAAA,CAAM,MAAA,CAAO,EAAA,GACxC,KAAA,CAAM,MAAA,CAAO,UAAA,IAAc,KAAA,CAAM,MAAA,CAAO,IAAA;AAG/C,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,WAAA,GAAc,SAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAc,CAAA;AAClB,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,KAAK,CAAA;AACnB,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,IAAI,CAAA;AAClB,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,MAAM,OAAA,GAAa,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,MAAM,CAAA;AACzC,IAAA,MAAM,UAAA,GAAa,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,MAAA,GAAS,KAAK,GAAG,CAAC,CAAA;AAEvD,IAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,IAAA,GAAA,CAAI,SAAS,CAAA,GAAI,SAAA,GAAY,CAAA,EAAG,OAAA,EAAS,WAAW,UAAU,CAAA;AAC9D,IAAA,IAAI,gBAAgB,KAAA,EAAO;AACvB,MAAA,GAAA,CAAI,WAAA,GAAc,WAAA;AAClB,MAAA,GAAA,CAAI,SAAA,GAAc,CAAA;AAClB,MAAA,GAAA,CAAI,WAAW,CAAA,GAAI,SAAA,GAAY,CAAA,EAAG,OAAA,EAAS,WAAW,UAAU,CAAA;AAAA,IACpE;AAAA,EACJ;AACJ;;;ACvDO,SAAS,qBAAA,CACZ,KACA,IAAA,EACA,QAAA,EACA,YACA,KAAA,EACA,KAAA,EACA,YACA,WAAA,EACI;AACJ,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AAGvB,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,WAAA,GAAc,MAAM,MAAA,CAAO,EAAA;AAC/B,EAAA,GAAA,CAAI,SAAA,GAAc,GAAA;AAClB,EAAA,GAAA,CAAI,QAAA,GAAc,OAAA;AAElB,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA;AAC/C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAClC,IAAA,MAAM,WAAW,QAAA,GAAW,CAAA;AAC5B,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU,UAAU,UAAU,CAAA;AACvD,IAAA,MAAM,CAAA,GAAI,MAAM,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,CAAE,KAAA,EAAO,YAAY,WAAW,CAAA;AAC/D,IAAA,CAAA,KAAM,CAAA,GAAI,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA;AAAA,EAChD;AACA,EAAA,GAAA,CAAI,MAAA,EAAO;AAGX,EAAA,MAAM,YAAA,GAAe,KAAK,GAAA,CAAI,CAAA,EAAG,MAAM,eAAA,CAAgB,QAAA,EAAU,UAAU,CAAA,GAAI,IAAI,CAAA;AACnF,EAAA,IAAI,eAAe,GAAA,EAAK;AAExB,EAAA,GAAA,CAAI,SAAA,GAAY,MAAM,MAAA,CAAO,EAAA;AAC7B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAClC,IAAA,MAAM,WAAW,QAAA,GAAW,CAAA;AAC5B,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU,UAAU,UAAU,CAAA;AACvD,IAAA,MAAM,CAAA,GAAI,MAAM,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,CAAE,KAAA,EAAO,YAAY,WAAW,CAAA;AAC/D,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,IAAI,CAAA,EAAG,CAAA,EAAG,cAAc,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AAC1C,IAAA,GAAA,CAAI,IAAA,EAAK;AAAA,EACb;AACJ;;;ACxCO,SAAS,cAAA,CACZ,KACA,IAAA,EACA,QAAA,EACA,YACA,KAAA,EACA,KAAA,EACA,YACA,WAAA,EACI;AACJ,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AAEvB,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,WAAA,GAAc,MAAM,MAAA,CAAO,EAAA;AAC/B,EAAA,GAAA,CAAI,SAAA,GAAc,GAAA;AAClB,EAAA,GAAA,CAAI,QAAA,GAAc,OAAA;AAElB,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA;AAC/C,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAClC,IAAA,MAAM,WAAW,QAAA,GAAW,CAAA;AAC5B,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU,UAAU,UAAU,CAAA;AACvD,IAAA,MAAM,CAAA,GAAI,MAAM,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,CAAE,KAAA,EAAO,YAAY,WAAW,CAAA;AAE/D,IAAA,IAAI,MAAM,CAAA,EAAG;AACT,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,IACnB,CAAA,MAAO;AACH,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,KAAK,CAAA;AACnB,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,IACnB;AACA,IAAA,KAAA,GAAQ,CAAA;AAAA,EACZ;AACA,EAAA,GAAA,CAAI,MAAA,EAAO;AACf;;;ACjCA,SAASA,UAAAA,CAAU,KAAa,KAAA,EAAuB;AACnD,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA;AAC7B,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,MAAA,KAAW,CAAA,GAAI,EAAE,KAAA,CAAM,EAAE,CAAA,CAAE,GAAA,CAAI,OAAK,CAAA,GAAI,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,GAAI,CAAA;AAClE,EAAA,MAAM,IAAI,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACpC,EAAA,MAAM,IAAI,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACpC,EAAA,MAAM,IAAI,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACpC,EAAA,OAAO,QAAQ,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,KAAK,CAAA,CAAA,CAAA;AACvC;AAEO,SAAS,aAAA,CACZ,KACA,IAAA,EACA,QAAA,EACA,YACA,KAAA,EACA,KAAA,EACA,YACA,WAAA,EACI;AACJ,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AAGvB,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA;AAC/C,EAAA,GAAA,CAAI,SAAA,EAAU;AAEd,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAClC,IAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,QAAA,GAAW,CAAA,EAAG,UAAU,UAAU,CAAA;AAC3D,IAAA,MAAM,CAAA,GAAI,MAAM,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,EAAM,YAAY,WAAW,CAAA;AAC9D,IAAA,CAAA,KAAM,CAAA,GAAI,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA;AAAA,EAChD;AAEA,EAAA,KAAA,IAAS,IAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,QAAA,GAAW,CAAA,EAAG,UAAU,UAAU,CAAA;AAC3D,IAAA,MAAM,CAAA,GAAI,MAAM,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,CAAE,GAAA,EAAK,YAAY,WAAW,CAAA;AAC7D,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,EACnB;AACA,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,SAAA,GAAYA,UAAAA,CAAU,KAAA,CAAM,MAAA,CAAO,IAAI,IAAI,CAAA;AAC/C,EAAA,GAAA,CAAI,IAAA,EAAK;AAGT,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,WAAA,GAAc,MAAM,MAAA,CAAO,EAAA;AAC/B,EAAA,GAAA,CAAI,SAAA,GAAc,GAAA;AAClB,EAAA,GAAA,CAAI,QAAA,GAAc,OAAA;AAClB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAClC,IAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,QAAA,GAAW,CAAA,EAAG,UAAU,UAAU,CAAA;AAC3D,IAAA,MAAM,CAAA,GAAI,MAAM,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,CAAE,KAAA,EAAO,YAAY,WAAW,CAAA;AAC/D,IAAA,CAAA,KAAM,CAAA,GAAI,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA;AAAA,EAChD;AACA,EAAA,GAAA,CAAI,MAAA,EAAO;AACf;;;ACnDA,SAASA,UAAAA,CAAU,KAAa,KAAA,EAAuB;AACnD,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA;AAC7B,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,MAAA,KAAW,CAAA,GAAI,EAAE,KAAA,CAAM,EAAE,CAAA,CAAE,GAAA,CAAI,OAAK,CAAA,GAAI,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA,GAAI,CAAA;AAClE,EAAA,MAAM,IAAI,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACpC,EAAA,MAAM,IAAI,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACpC,EAAA,MAAM,IAAI,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACpC,EAAA,OAAO,QAAQ,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,IAAI,KAAK,CAAA,CAAA,CAAA;AACvC;AAEO,SAAS,cAAA,CACZ,KACA,IAAA,EACA,QAAA,EACA,YACA,KAAA,EACA,KAAA,EACA,YACA,WAAA,EACI;AACJ,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AAEvB,EAAA,MAAM,aAAA,GAAA,CAAiB,UAAA,CAAW,GAAA,GAAM,UAAA,CAAW,GAAA,IAAO,CAAA;AAC1D,EAAA,MAAM,SAAA,GAAgB,KAAA,CAAM,QAAA,CAAS,aAAA,EAAe,YAAY,WAAW,CAAA;AAG3E,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA;AAC/C,EAAA,MAAM,GAAA,GAAkC,IAAA,CAAK,GAAA,CAAI,CAAC,KAAK,CAAA,MAAO;AAAA,IAC1D,GAAG,KAAA,CAAM,QAAA,CAAS,QAAA,GAAW,CAAA,EAAG,UAAU,UAAU,CAAA;AAAA,IACpD,GAAG,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,KAAA,EAAO,YAAY,WAAW;AAAA,GACxD,CAAE,CAAA;AAEF,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,CAAC,CAAA,CAAE,CAAA;AACtB,EAAA,MAAM,KAAA,GAAS,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,CAAE,CAAA;AAGnC,EAAA,MAAM,gBAAgB,MAAY;AAC9B,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,CAAA,KAAM,CAAA,GAAI,IAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,CAAE,CAAA,EAAG,IAAI,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,GAAA,CAAI,OAAO,GAAA,CAAI,CAAC,EAAE,CAAA,EAAG,GAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,IAC5E;AACA,IAAA,GAAA,CAAI,MAAA,CAAO,OAAO,SAAS,CAAA;AAC3B,IAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,SAAS,CAAA;AAC5B,IAAA,GAAA,CAAI,SAAA,EAAU;AAAA,EAClB,CAAA;AAGA,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,UAAA,EAAY,SAAS,CAAA;AACpC,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,aAAA,EAAc;AACd,EAAA,GAAA,CAAI,SAAA,GAAYA,UAAAA,CAAU,KAAA,CAAM,MAAA,CAAO,IAAI,IAAI,CAAA;AAC/C,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,OAAA,EAAQ;AAGZ,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,SAAA,EAAW,UAAA,EAAY,cAAc,SAAS,CAAA;AAC1D,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,aAAA,EAAc;AACd,EAAA,GAAA,CAAI,SAAA,GAAYA,UAAAA,CAAU,KAAA,CAAM,MAAA,CAAO,MAAM,IAAI,CAAA;AACjD,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,OAAA,EAAQ;AAGZ,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,WAAA,GAAc,MAAM,MAAA,CAAO,EAAA;AAC/B,EAAA,GAAA,CAAI,SAAA,GAAc,GAAA;AAClB,EAAA,GAAA,CAAI,QAAA,GAAc,OAAA;AAClB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,CAAA,KAAM,CAAA,GAAI,IAAI,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,CAAE,CAAA,EAAG,IAAI,CAAC,CAAA,CAAE,CAAC,CAAA,GAAI,GAAA,CAAI,OAAO,GAAA,CAAI,CAAC,EAAE,CAAA,EAAG,GAAA,CAAI,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,EAC5E;AACA,EAAA,GAAA,CAAI,MAAA,EAAO;AAGX,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,WAAA,GAAgBA,UAAAA,CAAU,KAAA,CAAM,MAAA,CAAO,IAAI,GAAG,CAAA;AAClD,EAAA,GAAA,CAAI,SAAA,GAAgB,CAAA;AACpB,EAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,EAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,SAAS,CAAA;AAC5B,EAAA,GAAA,CAAI,MAAA,CAAO,OAAQ,SAAS,CAAA;AAC5B,EAAA,GAAA,CAAI,MAAA,EAAO;AACX,EAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AACtB;;;ACpFO,SAAS,aAAA,CACZ,KACA,IAAA,EACA,QAAA,EACA,YACA,KAAA,EACA,KAAA,EACA,YACA,WAAA,EACI;AACJ,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,eAAA,CAAgB,QAAA,EAAU,UAAU,CAAA;AAC5D,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA;AAE/C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAClC,IAAA,MAAM,GAAA,GAAW,KAAK,CAAC,CAAA;AACvB,IAAA,MAAM,WAAW,QAAA,GAAW,CAAA;AAC5B,IAAA,MAAM,CAAA,GAAW,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU,UAAU,UAAU,CAAA;AAC9D,IAAA,MAAM,IAAA,GAAW,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,IAAA;AAElC,IAAA,MAAM,SAAY,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,KAAA,EAAO,YAAY,WAAW,CAAA;AACnE,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,cAAc,MAAM,CAAA;AAElD,IAAA,GAAA,CAAI,YAAY,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,EAAA,GAAK,MAAM,MAAA,CAAO,IAAA;AACtD,IAAA,GAAA,CAAI,SAAS,CAAA,GAAI,SAAA,GAAY,CAAA,EAAG,MAAA,EAAQ,WAAW,SAAS,CAAA;AAAA,EAChE;AACJ;;;ACzBO,SAAS,aAAA,CACZ,KACA,IAAA,EACA,QAAA,EACA,YACA,KAAA,EACA,KAAA,EACA,YACA,WAAA,EACI;AACJ,EAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA;AAE/C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAClC,IAAA,MAAM,GAAA,GAAW,KAAK,CAAC,CAAA;AACvB,IAAA,MAAM,WAAW,QAAA,GAAW,CAAA;AAC5B,IAAA,MAAM,CAAA,GAAW,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU,UAAU,UAAU,CAAA;AAC9D,IAAA,MAAM,IAAA,GAAW,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,IAAA;AAElC,IAAA,MAAM,QAAQ,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,IAAA,EAAM,YAAY,WAAW,CAAA;AAC9D,IAAA,MAAM,OAAQ,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,GAAA,EAAM,YAAY,WAAW,CAAA;AAE9D,IAAA,GAAA,CAAI,cAAc,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,EAAA,GAAK,MAAM,MAAA,CAAO,IAAA;AACxD,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,KAAK,CAAA;AACnB,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,IAAI,CAAA;AAClB,IAAA,GAAA,CAAI,MAAA,EAAO;AAAA,EACf;AACJ;;;AC5BO,SAAS,WACZ,GAAA,EACA,UAAA,EACA,OACA,KAAA,EACA,UAAA,EACA,aACA,SAAA,EACI;AACJ,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,WAAA,GAAc,GAAA;AAClB,EAAA,GAAA,CAAI,cAAc,KAAA,CAAM,IAAA;AACxB,EAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAIhB,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAA6B;AACzB,IAAA,KAAA,MAAW,KAAA,IAAS,kBAAA,CAAmB,UAAA,EAAY,WAAW,CAAA,EAAG;AAC7D,MAAA,MAAM,CAAA,GAAI,KAAK,KAAA,CAAM,KAAA,CAAM,SAAS,KAAA,EAAO,UAAA,EAAY,WAAW,CAAC,CAAA,GAAI,GAAA;AACvE,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AACf,MAAA,GAAA,CAAI,MAAA,CAAO,YAAY,CAAC,CAAA;AAAA,IAC5B;AAAA,EACJ;AASA,EAAA,GAAA,CAAI,MAAA,EAAO;AAGX,EAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,UAAA,GAAa,EAAE,CAAC,CAAA;AACxD,EAAA,MAAM,QAAQ,UAAA,GAAa,QAAA;AAC3B,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AAC/B,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,KAAK,CAAA,GAAI,GAAA;AAClC,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AACf,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,WAAW,CAAA;AAAA,EAC7B;AACA,EAAA,GAAA,CAAI,MAAA,EAAO;AAEX,EAAA,GAAA,CAAI,OAAA,EAAQ;AAChB;;;AC7CA,IAAM,YAAyB,CAAC,IAAA,EAAM,MAAM,KAAA,EAAO,KAAA,EAAO,MAAM,IAAI,CAAA;AAEpE,SAAS,mBAAA,CAAoB,EAAA,EAAY,SAAA,EAAsB,QAAA,GAAW,KAAA,EAAe;AACrF,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,EAAE,CAAA;AACrB,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA,EAAG;AAC/B,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,kBAAA,CAAmB,OAAA,EAAS,EAAE,KAAA,EAAO,OAAA,EAAS,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,UAAU,CAAA;AAClH,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,kBAAA,CAAmB,OAAA,EAAS,EAAE,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,UAAU,CAAA;AACpH,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA;AAAA,EAC3B;AACA,EAAA,IAAI,cAAc,IAAA,EAAM;AACpB,IAAA,OAAO,CAAA,CAAE,kBAAA,CAAmB,OAAA,EAAS,EAAE,KAAA,EAAO,SAAS,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,CAAA;AAAA,EAChG;AACA,EAAA,OAAO,CAAA,CAAE,kBAAA,CAAmB,OAAA,EAAS,EAAE,KAAA,EAAO,OAAA,EAAS,GAAA,EAAK,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,CAAA;AAChH;AAEO,SAAS,gBACd,GAAA,EACA,GAAA,EACA,UAAA,EACA,QAAA,EACA,OACA,KAAA,EACA,UAAA,EACA,WAAA,EACA,cAAA,EACA,OACA,SAAA,EACA,cAAA,GAAiB,GACjB,GAAA,GAAyB,wBAAA,EACzB,WAAW,KAAA,EACL;AACN,EAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,QAAA,EAAU,UAAU,UAAU,CAAA;AAC3D,EAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,KAAA,EAAO,YAAY,WAAW,CAAA;AAE3D,EAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,EAAA,GAAA,CAAI,cAAc,KAAA,CAAM,SAAA;AACxB,EAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAGhB,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AACf,EAAA,GAAA,CAAI,MAAA,CAAO,GAAG,KAAK,CAAA;AACnB,EAAA,GAAA,CAAI,MAAA,EAAO;AAGX,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AACf,EAAA,GAAA,CAAI,MAAA,CAAO,YAAY,CAAC,CAAA;AACxB,EAAA,GAAA,CAAI,MAAA,EAAO;AAEX,EAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAElB,EAAA,MAAM,SAAW,GAAA,CAAI,WAAA;AACrB,EAAA,MAAM,WAAW,GAAA,CAAI,aAAA;AACrB,EAAA,GAAA,CAAI,OAAO,CAAA,EAAG,GAAA,CAAI,QAAQ,CAAA,CAAA,EAAI,IAAI,UAAU,CAAA,CAAA;AAG5C,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,cAAc,CAAA;AACnD,EAAA,GAAA,CAAI,SAAA,GAAY,MAAM,OAAA,CAAQ,UAAA;AAC9B,EAAA,GAAA,CAAI,SAAS,UAAA,EAAY,CAAA,GAAI,MAAA,GAAS,CAAA,EAAG,gBAAgB,MAAM,CAAA;AAC/D,EAAA,GAAA,CAAI,cAAc,KAAA,CAAM,SAAA;AACxB,EAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,EAAA,GAAA,CAAI,WAAW,UAAA,EAAY,CAAA,GAAI,MAAA,GAAS,CAAA,EAAG,gBAAgB,MAAM,CAAA;AACjE,EAAA,GAAA,CAAI,SAAA,GAAY,MAAM,OAAA,CAAQ,IAAA;AAC9B,EAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAChB,EAAA,GAAA,CAAI,QAAA,CAAS,UAAA,EAAY,UAAA,GAAa,QAAA,EAAU,IAAI,CAAC,CAAA;AAGrD,EAAA,IAAI,IAAI,GAAA,EAAK;AACT,IAAA,MAAM,YAAY,mBAAA,CAAoB,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,WAAW,QAAQ,CAAA;AACvE,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,WAAA,CAAY,SAAS,CAAA,CAAE,KAAA;AACtC,IAAA,MAAM,IAAA,GAAO,KAAK,QAAA,GAAW,CAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,UAAA,GAAa,IAAA,EAAM,CAAA,GAAI,IAAA,GAAO,CAAC,CAAC,CAAA;AAElE,IAAA,GAAA,CAAI,SAAA,GAAY,MAAM,OAAA,CAAQ,UAAA;AAC9B,IAAA,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,MAAM,CAAA;AACtC,IAAA,GAAA,CAAI,cAAc,KAAA,CAAM,SAAA;AACxB,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,GAAA,CAAI,UAAA,CAAW,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,MAAM,CAAA;AACxC,IAAA,GAAA,CAAI,SAAA,GAAY,MAAM,OAAA,CAAQ,IAAA;AAC9B,IAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAChB,IAAA,GAAA,CAAI,QAAA,CAAS,SAAA,EAAW,IAAA,GAAO,QAAA,EAAU,QAAQ,EAAE,CAAA;AAAA,EACvD;AACF;;;ACzCO,SAAS,eACZ,QAAA,EACA,WAAA,EACA,aAAA,mBAAqC,IAAI,KAAI,EAC/B;AAEd,EAAA,MAAM,QAAA,GAAW,SACZ,MAAA,CAAO,CAAC,MAAM,CAAC,aAAA,CAAc,IAAI,CAAA,CAAE,KAAA,CAAM,KAAK,CAAC,CAAA,CAC/C,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA;AAE7B,EAAA,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,OAAO,EAAC;AAEjC,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,IAAI,YAAA,GAAgC,CAAC,QAAA,CAAS,CAAC,CAAC,CAAA;AAChD,EAAA,IAAI,WAAA,GAAc,QAAA,CAAS,CAAC,CAAA,CAAE,CAAA;AAE9B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,CAAA,GAAI,SAAS,CAAC,CAAA;AACpB,IAAA,IAAI,CAAA,CAAE,CAAA,GAAI,WAAA,IAAe,WAAA,EAAa;AAClC,MAAA,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,IACvB,CAAA,MAAO;AACH,MAAA,MAAA,CAAO,KAAK,YAAY,CAAA;AACxB,MAAA,YAAA,GAAe,CAAC,CAAC,CAAA;AACjB,MAAA,WAAA,GAAc,CAAA,CAAE,CAAA;AAAA,IACpB;AAAA,EACJ;AACA,EAAA,MAAA,CAAO,KAAK,YAAY,CAAA;AAGxB,EAAA,OAAO,MAAA,CACF,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAC,CAAA,CAC3B,GAAA,CAAI,CAAC,OAAA,KAAY;AACd,IAAA,MAAM,EAAA,GACF,UAAA,GACA,OAAA,CACK,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,CACxB,IAAA,EAAK,CACL,KAAK,GAAG,CAAA;AACjB,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,CAAA,EAAG,CAAC,CAAA,GAAI,OAAA,CAAQ,MAAA;AACnE,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA,GAAI,OAAA,CAAQ,MAAA;AAC3E,IAAA,OAAO,EAAE,EAAA,EAAI,OAAA,EAAS,OAAA,EAAS,WAAA,EAAY;AAAA,EAC/C,CAAC,CAAA;AACT;AAUO,SAAS,mBAAA,CACZ,OAAA,EACA,IAAA,EACA,KAAA,GAAgB,CAAA,EACG;AACnB,EAAA,MAAM,CAAA,GAAI,QAAQ,OAAA,CAAQ,MAAA;AAC1B,EAAA,MAAM,MAAA,GAAS,CAAA,GAAI,IAAA,GAAA,CAAQ,CAAA,GAAI,CAAA,IAAK,KAAA;AACpC,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,GAAU,MAAA,GAAS,CAAA;AAG1C,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,OAAA,CAAQ,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA;AAE5D,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAA,CAAO,GAAA,CAAI,OAAO,CAAC,CAAA,CAAE,MAAM,KAAA,EAAO,MAAA,GAAS,CAAA,IAAK,IAAA,GAAO,KAAA,CAAM,CAAA;AAAA,EACjE;AACA,EAAA,OAAO,MAAA;AACX;AAgBO,SAAS,uBAAA,CACZ,OAAA,EACA,MAAA,EACA,GAAA,EACkB;AAGlB,EAAA,MAAM,QAAA,GAAW,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAC7B,CAAC,MAAM,CAAA,CAAE,KAAA,CAAM,SAAS,UAAA,IAAc,CAAE,EAAE,KAAA,CAAwB;AAAA,GACtE,CAAE,MAAA;AACF,EAAA,MAAM,UAAA,GAAa,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAC/B,CAAC,MAAM,CAAA,CAAE,KAAA,CAAM,SAAS,SAAA,IAAc,CAAA,CAAE,MAAwB,kBAAA,KAAuB;AAAA,GAC3F,CAAE,MAAA;AACF,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,CAAM,IAAA,KAAS,OAAO,CAAA,CAAE,MAAA;AAC3E,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,QAAA,GAAW,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,QAAQ,CAAA,SAAA,EAAY,QAAA,GAAW,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,CAAE,CAAA;AAC7E,EAAA,IAAI,UAAA,GAAa,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,UAAU,CAAA,MAAA,EAAS,UAAA,GAAa,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,CAAE,CAAA;AAChF,EAAA,IAAI,UAAA,GAAa,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,UAAU,CAAA,MAAA,EAAS,UAAA,GAAa,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,CAAE,CAAA;AAChF,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAE7B,EAAA,MAAM,KAAA,GAAQ,EAAA;AAEd,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,WAAA,CAAY,IAAI,CAAA,CAAE,KAAA;AACpC,EAAA,MAAM,aAAA,GAAgB,EAAA;AACtB,EAAA,MAAM,MAAA,GAAS,KAAA,GAAQ,KAAA,GAAQ,aAAA,GAAgB,KAAA;AAC/C,EAAA,MAAM,MAAA,GAAS,EAAA;AACf,EAAA,MAAM,MAAA,GAAA,CAAU,SAAS,MAAA,IAAU,CAAA;AACnC,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,GAAU,MAAA,GAAS,CAAA;AAE1C,EAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,QAAQ,IAAA,EAAK;AAClD;AAQO,SAAS,mBAAA,CACZ,CAAA,EACA,CAAA,EACA,KAAA,EAC0B;AAC1B,EAAA,OAAO,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,KAAK,CAAA,CAAE,CAAA,IAAK,KAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,IAAK,CAAA,IAAK,EAAE,CAAA,IAAK,CAAA,IAAK,EAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA;AAC1F;;;AC5JA,IAAM,SAAA,GAAY,CAAA;AAClB,IAAM,UAAA,GAAa,CAAA;AACnB,IAAM,QAAA,GAAW,CAAA;AACjB,IAAM,SAAA,GAAY,CAAA;AAClB,IAAM,KAAA,GAAQ,EAAA;AACd,IAAM,UAAA,GAAa,CAAA;AACnB,IAAM,UAAA,GAAa,CAAA;AACnB,IAAM,OAAA,GAAU,CAAA;AAChB,IAAM,MAAA,GAAS,CAAA;AACf,IAAM,QAAA,GAAW,CAAA;AACjB,IAAM,SAAA,GAAY,CAAA;AAClB,IAAM,WAAA,GAAc,CAAA;AACpB,IAAM,OAAA,GAAU,CAAA;AAChB,IAAM,SAAA,GAAY,qCAAA;AAClB,IAAM,QAAA,GAAW,qCAAA;AACjB,IAAM,MAAA,GAAS,EAAA;AACf,IAAM,UAAA,GAAa,GAAA;AACnB,IAAM,cAAA,GAAiB,CAAA;AACvB,IAAM,iBAAA,GAAoB,CAAA;AAC1B,IAAM,iBAAA,GAAoB,CAAA;AAC1B,IAAM,aAAA,GAAgB,QAAQ,iBAAA,GAAoB,CAAA;AAClD,IAAM,YAAA,GAAe,qCAAA;AACrB,IAAM,kBAAA,GAAqB,IAAA;AAE3B,IAAM,mBAAA,GAAsB,CAAC,CAAA,EAAG,KAAA,EAAO,IAAI,CAAA;AAC3C,IAAM,yBAAA,GAA4B,EAAA;AAuIlC,SAAS,OAAO,KAAA,EAA0D;AACtE,EAAA,OAAO,KAAA,CAAM,IAAA,KAAS,UAAA,IAAc,CAAC,CAAE,KAAA,CAA+B,OAAA;AAC1E;AAEA,SAAS,aAAA,CAAc,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAqB;AAC5E,EAAA,OAAO,EAAA,GAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAK,EAAA,GAAK,EAAA;AACrC;AAUO,SAAS,2BAAA,CACZ,KAAA,EACA,aAAA,EACA,IAAA,EACA,WACA,mBAAA,EACM;AACN,EAAA,MAAM,YAAmD,EAAC;AAC1D,EAAA,IAAI,KAAA,EAAO,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA;AAC/B,EAAA,KAAA,MAAW,CAAA,IAAK,mBAAA,EAAqB,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA;AAErD,EAAA,IAAI,IAAA,GAAO,aAAA;AACX,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,MAAM,WAAA,GAAc,UAAU,MAAA,GAAS,CAAA;AACvC,EAAA,OAAO,WAAW,WAAA,EAAa;AAC3B,IAAA,MAAM,GAAA,GAAM,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,aAAA,CAAc,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AAC3E,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,IAAA,IAAQ,aAAa,IAAA,GAAO,CAAA,CAAA;AAC5B,IAAA,QAAA,EAAA;AAAA,EACJ;AACA,EAAA,OAAO,IAAA;AACX;AAOA,SAAS,mBAAA,CAAoB,KAAA,EAAiB,KAAA,EAAe,SAAA,EAAmB,WAAoB,KAAA,EAAe;AAC/G,EAAA,IAAK,KAAA,CAAM,MAA6C,QAAA,EAAU;AAC9D,IAAA,MAAM,CAAA,GAAI,KAAA;AACV,IAAA,MAAM,SAAA,GAAY,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACjE,IAAA,MAAM,SAAA,GAAY,CAAA,CAAE,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,CAAA,CAAE,SAAA,CAAU,KAAA,CAAM,CAAC,CAAA;AAC3E,IAAA,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,EACpC;AAEA,EAAA,IAAI,KAAA,CAAM,SAAS,SAAA,EAAW;AAC1B,IAAA,MAAM,CAAA,GAAI,KAAA;AACV,IAAA,MAAM,OAAA,GAAU,CAAC,QAAA,IAAY,CAAA,CAAE,SAAS,MAAA,GAAY,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA,GAAK,EAAA;AACnE,IAAA,OAAO,KAAA,CAAM,IAAA,IAAQ,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,WAAA,EAAa,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAC,CAAA,CAAA;AAAA,EACvF;AAEA,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,UAAA,IAAe,KAAA,CAAwB,kBAAA,EAAoB;AAC1E,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,MAAM,UAAU,GAAA,CAAI,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,aAAY,GAAI,EAAA;AACpD,IAAA,MAAM,OAAA,GAAU,CAAC,QAAA,IAAY,GAAA,CAAI,SAAS,MAAA,GAAY,CAAA,CAAA,EAAI,GAAA,CAAI,IAAI,CAAA,CAAA,GAAK,EAAA;AACvE,IAAA,OAAO,KAAA,CAAM,IAAA,IAAQ,CAAA,EAAG,OAAO,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAC,CAAA,CAAA;AAAA,EAC1E;AAEA,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,UAAA,EAAY,OAAO,MAAM,IAAA,IAAQ,EAAA;AACpD,EAAA,OAAO,KAAA,CAAM,QAAQ,KAAA,CAAM,KAAA;AAC/B;AAUA,SAAS,mBAAA,CACL,MAAA,EACA,KAAA,EACA,UAAA,EACA,MAAA,EACA,MAAA,EACA,aAAA,EACA,YAAA,EACA,YAAA,EACA,aAAA,EACA,WAAA,GAAsB,aAAA,EACH;AAGnB,EAAA,MAAM,QAA2C,EAAC;AAElD,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAExB,IAAA,IAAI,KAAA,CAAM,KAAA,KAAU,YAAA,IAAgB,KAAA,CAAM,UAAU,aAAA,EAAe;AACnE,IAAA,MAAM,EAAA,GAAK,KAAA;AACX,IAAA,IAAI,EAAA,CAAG,kBAAkB,MAAA,EAAW;AAChC,MAAA,MAAM,GAAA,GAAM,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,SAAA,CAAA;AAC1B,MAAA,MAAM,SAAS,aAAA,KAAkB,GAAA;AACjC,MAAA,MAAM,KAAA,GAAQ,MAAA,IAAU,YAAA,KAAiB,IAAA,GAAO,eAAe,EAAA,CAAG,aAAA;AAClE,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,GAAA,EAAK,CAAA,EAAG,KAAA,CAAM,SAAS,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA,EAAG,CAAA;AAAA,IACpE;AACA,IAAA,IAAI,EAAA,CAAG,oBAAoB,MAAA,EAAW;AAClC,MAAA,MAAM,GAAA,GAAM,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,WAAA,CAAA;AAC1B,MAAA,MAAM,SAAS,aAAA,KAAkB,GAAA;AACjC,MAAA,MAAM,KAAA,GAAQ,MAAA,IAAU,YAAA,KAAiB,IAAA,GAAO,eAAe,EAAA,CAAG,eAAA;AAClE,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,GAAA,EAAK,CAAA,EAAG,KAAA,CAAM,SAAS,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA,EAAG,CAAA;AAAA,IACpE;AAAA,EACJ;AAEA,EAAA,KAAA,CAAM,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA;AAE9B,EAAA,MAAM,QAAQ,MAAA,GAAS,kBAAA;AACvB,EAAA,MAAM,UAAU,mBAAA,CAAoB,GAAA,CAAI,CAAC,CAAA,KAAM,KAAA,GAAQ,IAAI,MAAM,CAAA;AACjE,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,QAAS,CAAA;AAC5C,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AAEvC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACtB,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,IAAI,IAAA,CAAK,CAAA,IAAK,QAAA,CAAS,CAAC,IAAI,WAAA,EAAa;AACrC,QAAA,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AAC/B,QAAA,QAAA,CAAS,CAAC,IAAI,IAAA,CAAK,CAAA;AACnB,QAAA,QAAA,GAAW,IAAA;AACX,QAAA;AAAA,MACJ;AAAA,IACJ;AACA,IAAA,IAAI,CAAC,QAAA,EAAU;AACX,MAAA,MAAM,OAAO,QAAA,CAAS,OAAA,CAAQ,KAAK,GAAA,CAAI,GAAG,QAAQ,CAAC,CAAA;AACnD,MAAA,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,GAAA,EAAK,OAAA,CAAQ,IAAI,CAAC,CAAA;AAClC,MAAA,QAAA,CAAS,IAAI,IAAI,IAAA,CAAK,CAAA;AAAA,IAC1B;AAAA,EACJ;AAEA,EAAA,OAAO,MAAA;AACX;AAOA,SAAS,aAAa,KAAA,EAAwB;AAC1C,EAAA,MAAM,CAAA,GAAI,MAAM,IAAA,EAAK;AACrB,EAAA,IAAI,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,EAAA;AAExB,EAAA,IAAI,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AACnB,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA;AACrB,IAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,IAAK,GAAA,CAAI,WAAW,CAAA,EAAG;AACtC,MAAA,CAAA,GAAI,SAAS,GAAA,CAAI,CAAC,IAAI,GAAA,CAAI,CAAC,GAAG,EAAE,CAAA;AAChC,MAAA,CAAA,GAAI,SAAS,GAAA,CAAI,CAAC,IAAI,GAAA,CAAI,CAAC,GAAG,EAAE,CAAA;AAChC,MAAA,CAAA,GAAI,SAAS,GAAA,CAAI,CAAC,IAAI,GAAA,CAAI,CAAC,GAAG,EAAE,CAAA;AAAA,IACpC,WAAW,GAAA,CAAI,MAAA,KAAW,CAAA,IAAK,GAAA,CAAI,WAAW,CAAA,EAAG;AAC7C,MAAA,CAAA,GAAI,SAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAChC,MAAA,CAAA,GAAI,SAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAChC,MAAA,CAAA,GAAI,SAAS,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AAAA,IACpC;AAAA,EACJ,CAAA,MAAO;AACH,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,KAAA,CAAM,iDAAiD,CAAA;AACnE,IAAA,IAAI,CAAA,EAAG;AACH,MAAA,CAAA,GAAI,UAAA,CAAW,CAAA,CAAE,CAAC,CAAC,CAAA;AACnB,MAAA,CAAA,GAAI,UAAA,CAAW,CAAA,CAAE,CAAC,CAAC,CAAA;AACnB,MAAA,CAAA,GAAI,UAAA,CAAW,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,IACvB;AAAA,EACJ;AAEA,EAAA,IAAI,IAAI,CAAA,IAAK,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,KAAK,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,IAAK,OAAO,KAAA,CAAM,CAAC,KAAK,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,EAAG;AAClF,IAAA,OAAO,IAAA;AAAA,EACX;AACA,EAAA,MAAM,aAAa,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,CAAA,GAAI,SAAS,CAAA,IAAK,GAAA;AAC3D,EAAA,OAAO,SAAA,IAAa,GAAA;AACxB;AAGA,SAAS,UAAU,KAAA,EAA2B;AAC1C,EAAA,OAAO,YAAA,CAAa,KAAA,CAAM,UAAU,CAAA,GAAI,SAAA,GAAY,SAAA;AACxD;AAGA,SAAS,SAAA,CAAU,OAAmB,MAAA,EAAyB;AAC3D,EAAA,MAAM,MAAA,GAAS,CAAC,YAAA,CAAa,KAAA,CAAM,UAAU,CAAA;AAC7C,EAAA,IAAI,MAAA,EAAQ,OAAO,MAAA,GAAS,eAAA,GAAkB,YAAA;AAC9C,EAAA,OAAO,SAAS,kBAAA,GAAqB,kBAAA;AACzC;AAGA,SAAS,UAAA,CAAW,KAAA,EAAiB,MAAA,EAAmC,KAAA,EAA2B;AAC/F,EAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC3B,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,IAAI,GAAA,CAAI,kBAAA,IAAsB,GAAA,CAAI,IAAA,EAAM;AACpC,MAAA,OAAO,GAAA,CAAI,IAAA,KAAS,KAAA,GAAQ,MAAA,CAAO,iBAAiB,MAAA,CAAO,eAAA;AAAA,IAC/D;AACA,IAAA,MAAM,MAAO,KAAA,CAA2B,GAAA;AACxC,IAAA,IAAI,GAAA,KAAQ,QAAW,OAAO,GAAA,IAAO,IAAI,KAAA,CAAM,MAAA,CAAO,EAAA,GAAK,KAAA,CAAM,MAAA,CAAO,IAAA;AACxE,IAAA,OAAO,MAAA,CAAO,YAAA;AAAA,EAClB;AACA,EAAA,IAAI,KAAA,CAAM,SAAS,SAAA,EAAW;AAC1B,IAAA,MAAM,CAAA,GAAI,KAAA;AACV,IAAA,OAAO,CAAA,CAAE,IAAA,KAAS,KAAA,GAAQ,MAAA,CAAO,iBAAiB,MAAA,CAAO,eAAA;AAAA,EAC7D;AACA,EAAA,OAAO,MAAA,CAAO,SAAA;AAClB;AASA,SAAS,YAAY,KAAA,EAA0B;AAC3C,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,SAAA,EAAW,OAAO,IAAA;AACrC,EAAA,IAAI,MAAM,IAAA,KAAS,UAAA;AACf,IAAA,OAAO,CAAC,CAAE,KAAA,CAAmD,kBAAA;AACjE,EAAA,OAAO,KAAA;AACX;AAKO,SAAS,iBAAA,CACZ,KACA,MAAA,EACA,KAAA,EACA,YACA,KAAA,EACA,MAAA,EACA,QACA,SAAA,EACA,YAAA,GAA8B,MAC9B,aAAA,GAA+B,IAAA,EAC/B,eAA8B,IAAA,EAC9B,aAAA,GAA+B,MAC/B,aAAA,mBAAqC,IAAI,KAAI,EAC7C,aAAA,GAAqC,QACrC,iBAAA,GAA6B,KAAA,EAC7B,kBAAiC,IAAA,EACjC,eAAA,GAAgD,EAAC,EACjD,gBAAA,uBAA4C,GAAA,EAAI,EAChD,qBAA6B,CAAA,EAC7B,iBAAA,GAA6B,OAE7B,cAAA,GAAgC,IAAA,EAEhC,iBAAgC,IAAA,EAKhC,WAAA,GAAsB,CAAA,EAMtB,kBAAA,GAA8B,KAAA,EACR;AACtB,EAAA,IAAI,OAAO,MAAA,KAAW,CAAA;AAClB,IAAA,OAAO;AAAA,MACH,UAAU,EAAC;AAAA,MACX,WAAW,EAAC;AAAA,MACZ,YAAY,EAAC;AAAA,MACb,WAAW,EAAC;AAAA,MACZ,cAAc,EAAC;AAAA,MACf,iBAAiB,EAAC;AAAA,MAClB,mBAAmB,EAAC;AAAA,MACpB,UAAU;AAAC,KACf;AAEJ,EAAA,MAAM,SAAS,KAAA,CAAM,WAAA;AAIrB,EAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,WAAA,EAAa,CAAC,GAAG,CAAC,CAAA;AAC9C,EAAA,MAAM,SAAS,OAAA,GAAU,CAAA;AACzB,EAAA,MAAM,QAAQ,MAAA,GAAS,CAAA;AACvB,EAAA,MAAM,WAAW,SAAA,GAAY,CAAA;AAC7B,EAAA,MAAM,UAAU,QAAA,GAAW,CAAA;AAC3B,EAAA,MAAM,aAAa,WAAA,GAAc,CAAA;AAIjC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,OAAO,QAAQ,CAAA;AAChD,EAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,KAAA,GAAQ,YAAY,CAAA,EAAG,OAAA,GAAU,CAAA,GAAI,SAAA,GAAY,CAAC,CAAA;AAExE,EAAA,MAAM,cAAc,IAAA,CAAK,GAAA,CAAI,eAAe,MAAA,GAAS,CAAA,GAAI,oBAAoB,CAAC,CAAA;AAE9E,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,IAAA,GAAO,SAAA;AAGX,EAAA,MAAM,WAMD,EAAC;AAEN,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAExB,IAAA,MAAM,QACF,aAAA,KAAkB,KAAA,CAAM,SAAS,YAAA,KAAiB,IAAA,GAAO,eAAe,KAAA,CAAM,KAAA;AAElF,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,KAAA,EAAO,YAAY,MAAM,CAAA;AAClD,IAAA,IAAI,CAAA,GAAI,GAAA,IAAO,CAAA,GAAI,MAAA,GAAS,EAAA,EAAI;AAGhC,IAAA,IAAI,kBAAkB,KAAA,IAAS,KAAA,CAAM,SAAS,UAAA,IAAc,KAAA,CAAM,UAAU,aAAA,EAAe;AACvF,MAAA,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,KAAA,EAAO,GAAG,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,CAAA;AACnD,MAAA;AAAA,IACJ;AAGA,IAAA,MAAM,aAAA,GACF,MAAM,IAAA,KAAS,SAAA,IACd,MAA4B,SAAA,KAAc,QAAA,IAC1C,KAAA,CAAM,IAAA,EAA6C,QAAA,KAAa,IAAA;AACrE,IAAA,IAAI,aAAA,EAAe;AACf,MAAA,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,KAAA,EAAO,GAAG,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,CAAA;AACnD,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAA,GAAK,MAA8B,OAAA,GAAU,IAAA;AACzE,IAAA,MAAM,UAAA,GAAa,aAAA,CAAc,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA;AAEhD,IAAA,MAAM,OAAO,OAAA,GAAU,GAAA,CAAI,YAAY,OAAO,CAAA,CAAE,QAAQ,OAAA,GAAU,CAAA;AAGlE,IAAA,MAAM,gBAAA,GAAmB,cAAc,CAAC,iBAAA;AACxC,IAAA,MAAM,QAAA,GAAW,gBAAA,GAAA,CAAoB,QAAA,GAAW,CAAA,GAAI,cAAc,CAAA,GAAI,CAAA;AACtE,IAAA,MAAM,MAAA,GAAS,oBAAoB,iBAAA,GAAoB,CAAA,GAAI,QAAQ,CAAA,GAAI,OAAA,GAAU,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,CAAA;AAC1G,IAAA,MAAM,YAAA,GAAgB,KAAA,CAAM,IAAA,EAA6C,QAAA,KAAa,IAAA;AACtF,IAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,KAAA,KAAU,aAAA,IAAiB,UAAA;AACxD,IAAA,MAAM,oBAAA,GAAuB,KAAA,CAAM,IAAA,KAAS,UAAA,IAAe,MAAwB,kBAAA,KAAuB,IAAA;AAC1G,IAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,IAAA,KAAS,SAAA,IAAa,oBAAA;AACrD,IAAA,MAAM,YAAa,KAAA,CAA4C,IAAA;AAC/D,IAAA,MAAM,WAAA,GAAe,sBAAsB,YAAA,IAAgB,cAAA,CAAA,IAAmB,oBAAoB,SAAA,KAAc,MAAA,GAC1G,MAAA,CAAO,SAAS,CAAA,GAChB,IAAA;AACN,IAAA,MAAM,cAAc,mBAAA,CAAoB,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,gBAAgB,IAAI,CAAA;AACrF,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,WAAA,CAAY,WAAW,CAAA,CAAE,KAAA;AAC5C,IAAA,MAAM,KAAA,GAAQ,cAAc,UAAA,GAAa,GAAA,CAAI,YAAY,WAAW,CAAA,CAAE,KAAA,GAAQ,UAAA,GAAa,QAAA,GAAW,CAAA;AACtG,IAAA,MAAM,KAAK,SAAA,GAAY,KAAA,GAAQ,IAAA,GAAO,MAAA,GAAS,YAAY,QAAA,GAAW,MAAA;AAEtE,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,KAAA,EAAO,GAAG,IAAA,EAAM,EAAA,EAAI,MAAM,CAAA;AAAA,EACrD;AAGA,EAAA,MAAM,qBAAA,uBAA4B,GAAA,EAAY;AAC9C,EAAA,IAAI,eAAA,EAAiB,qBAAA,CAAsB,GAAA,CAAI,eAAe,CAAA;AAE9D,EAAA,MAAM,QAAA,GAAW,qBAAqB,CAAA,GAChC,cAAA,CAAe,UAAU,kBAAA,EAAoB,qBAAqB,IAClE,EAAC;AAEP,EAAA,MAAM,iBAAA,GAAoB,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,gBAAA,CAAiB,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AAC5E,EAAA,MAAM,mBAAA,GAAsB,SAAS,MAAA,CAAO,CAAC,MAAM,gBAAA,CAAiB,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AAG7E,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAAY;AACxC,EAAA,KAAA,MAAW,KAAK,iBAAA,EAAmB;AAC/B,IAAA,KAAA,MAAW,KAAK,CAAA,CAAE,OAAA,kBAAyB,GAAA,CAAI,CAAA,CAAE,MAAM,KAAK,CAAA;AAAA,EAChE;AAGA,EAAA,MAAM,kBAAA,uBAAyB,GAAA,EAAiC;AAChE,EAAA,KAAA,MAAW,MAAM,mBAAA,EAAqB;AAClC,IAAA,kBAAA,CAAmB,IAAI,EAAA,CAAG,EAAA,EAAI,oBAAoB,EAAA,EAAI,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,EAClE;AAGA,EAAA,MAAM,sBAAA,uBAA6B,GAAA,EAA0B;AAC7D,EAAA,KAAA,MAAW,MAAM,mBAAA,EAAqB;AAClC,IAAA,KAAA,MAAW,CAAA,IAAK,GAAG,OAAA,EAAS,sBAAA,CAAuB,IAAI,CAAA,CAAE,KAAA,CAAM,OAAO,EAAE,CAAA;AAAA,EAC5E;AAGA,EAAA,QAAA,CAAS,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA;AAEjC,EAAA,MAAM,SAA+D,EAAC;AACtE,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAyB;AAE7C,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AAEtB,IAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,CAAA,CAAE,KAAA,CAAM,KAAK,CAAA,EAAG;AAGxC,IAAA,MAAM,EAAA,GAAK,sBAAA,CAAuB,GAAA,CAAI,CAAA,CAAE,MAAM,KAAK,CAAA;AACnD,IAAA,IAAI,EAAA,EAAI;AACJ,MAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,GAAA,CAAI,EAAA,CAAG,EAAE,CAAA;AAC3C,MAAA,MAAM,IAAA,GAAO,MAAA,EAAQ,GAAA,CAAI,CAAA,CAAE,MAAM,KAAK,CAAA;AACtC,MAAA,IAAI,SAAS,MAAA,EAAW;AACpB,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AAC9D,QAAA,OAAA,CAAQ,IAAI,CAAA,CAAE,KAAA,CAAM,OAAO,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,EAAE,CAAA,EAAG,IAAA,EAAM,MAAM,IAAA,EAAM,CAAA,CAAE,MAAM,IAAA,EAAM,CAAA,CAAE,MAAM,CAAA;AAC7F,QAAA;AAAA,MACJ;AAAA,IACJ;AAGA,IAAA,IAAI,IAAA,GAAO,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,IAAA,GAAO,CAAA;AAC1B,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,OAAO,QAAA,GAAW,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AACjC,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,aAAA,CAAc,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AAC/E,MAAA,IAAI,CAAC,QAAA,EAAU;AACf,MAAA,IAAA,IAAQ,EAAE,IAAA,GAAO,CAAA;AACjB,MAAA,QAAA,EAAA;AAAA,IACJ;AAEA,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,OAAO,IAAA,EAAM,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AACxD,IAAA,OAAA,CAAQ,IAAI,CAAA,CAAE,KAAA,CAAM,OAAO,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,MAAM,IAAA,EAAM,CAAA,CAAE,MAAM,IAAA,EAAM,CAAA,CAAE,MAAM,CAAA;AAAA,EAC3F;AAGA,EAAA,MAAM,eAAA,GAAkB,mBAAA;AAAA,IACpB,MAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACJ;AAcA,EAAA,MAAM,eAA8B,EAAC;AAErC,EAAA,MAAM,YAAY,MAAA,GAAS,kBAAA;AAC3B,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AACxB,IAAA,IAAI,KAAA,CAAM,KAAA,KAAU,YAAA,IAAgB,KAAA,CAAM,UAAU,aAAA,EAAe;AACnE,IAAA,MAAM,EAAA,GAAK,KAAA;AACX,IAAA,MAAM,QAAA,GAAW,kBAAkB,KAAA,CAAM,KAAA;AACzC,IAAA,IAAI,EAAA,CAAG,kBAAkB,MAAA,EAAW;AAChC,MAAA,MAAM,GAAA,GAAM,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,SAAA,CAAA;AAC1B,MAAA,MAAM,UAAU,aAAA,KAAkB,GAAA;AAClC,MAAA,MAAM,KAAA,GAAQ,WAAW,YAAA,KAAiB,IAAA,GACpC,eACA,QAAA,IAAY,cAAA,KAAmB,IAAA,GAC3B,cAAA,GACA,EAAA,CAAG,aAAA;AACb,MAAA,YAAA,CAAa,IAAA,CAAK;AAAA,QACd,GAAA;AAAA,QACA,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,CAAA,EAAG,KAAA,CAAM,QAAA,CAAS,KAAA,EAAO,YAAY,MAAM,CAAA;AAAA,QAC3C,OAAA,EAAS,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,IAAK;AAAA,OACxC,CAAA;AAAA,IACL;AACA,IAAA,IAAI,EAAA,CAAG,oBAAoB,MAAA,EAAW;AAClC,MAAA,MAAM,GAAA,GAAM,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,WAAA,CAAA;AAC1B,MAAA,MAAM,UAAU,aAAA,KAAkB,GAAA;AAClC,MAAA,MAAM,KAAA,GAAQ,WAAW,YAAA,KAAiB,IAAA,GACpC,eACA,QAAA,IAAY,cAAA,KAAmB,IAAA,GAC3B,cAAA,GACA,EAAA,CAAG,eAAA;AACb,MAAA,YAAA,CAAa,IAAA,CAAK;AAAA,QACd,GAAA;AAAA,QACA,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,CAAA,EAAG,KAAA,CAAM,QAAA,CAAS,KAAA,EAAO,YAAY,MAAM,CAAA;AAAA,QAC3C,OAAA,EAAS,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA,IAAK;AAAA,OACxC,CAAA;AAAA,IACL;AAAA,EACJ;AACA,EAAA,YAAA,CAAa,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA;AAErC,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAoB;AAC/C,EAAA,MAAM,iBAAyE,EAAC;AAChF,EAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC7B,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,KAAK,CAAA;AACpC,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,CAAA,GAAI,WAAA,GAAc,CAAA;AAC7C,IAAA,MAAM,SAAA,GAAY,QAAQ,EAAE,IAAA,EAAM,MAAM,IAAA,EAAM,IAAA,EAAM,KAAA,CAAM,IAAA,EAAK,GAAI,IAAA;AACnE,IAAA,MAAM,GAAA,GAAM,QAAS,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,IAAK,CAAA,GAAK,CAAA;AACzD,IAAA,MAAM,gBAAA,GAAmB,eAAe,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAA,KAAY,KAAK,OAAO,CAAA;AAChF,IAAA,MAAM,OAAA,GAAU,2BAAA;AAAA,MACZ,SAAA;AAAA,MACA,aAAA;AAAA,MACA,WAAA;AAAA,MACA,GAAA;AAAA,MACA;AAAA,KACJ;AACA,IAAA,cAAA,CAAe,GAAA,CAAI,IAAA,CAAK,GAAA,EAAK,OAAO,CAAA;AACpC,IAAA,cAAA,CAAe,IAAA,CAAK,EAAE,OAAA,EAAS,IAAA,CAAK,SAAS,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,WAAA,EAAa,CAAA;AAAA,EACnF;AAGA,EAAA,MAAM,cAAc,YAAA,IAAgB,aAAA;AACpC,EAAA,MAAM,sBAAsB,eAAA,IAAmB,aAAA;AAE/C,EAAA,MAAM,eAAA,GAAkB,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,eAAA,CAAgB,GAAA,CAAI,CAAA,CAAE,KAAA,CAAM,KAAK,CAAC,CAAA;AAClF,EAAA,MAAM,SAAA,GAAY;AAAA,IACd,GAAG,gBAAgB,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,CAAM,UAAU,WAAW,CAAA;AAAA,IAC9D,GAAG,gBAAgB,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,CAAM,UAAU,WAAW;AAAA,GAClE;AAEA,EAAA,MAAM,WAAgC,EAAC;AACvC,EAAA,MAAM,YAAiC,EAAC;AACxC,EAAA,MAAM,aAA+B,EAAC;AACtC,EAAA,MAAM,YAA2B,EAAC;AAClC,EAAA,MAAM,eAAwC,EAAC;AAC/C,EAAA,MAAM,kBAAyC,EAAC;AAChD,EAAA,MAAM,oBAA2C,EAAC;AAClD,EAAA,MAAM,oBAAwC,EAAC;AAG/C,EAAA,KAAA,MAAW,WAAW,iBAAA,EAAmB;AACrC,IAAA,gBAAA,CAAiB,GAAA,EAAK,OAAA,EAAS,MAAA,EAAQ,KAAA,EAAO,iBAAiB,CAAA;AAAA,EACnE;AAGA,EAAA,KAAA,MAAW,EAAE,KAAA,EAAM,IAAK,SAAA,EAAW;AAC/B,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA;AACtC,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,SAAA;AAAA,MACI,GAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAM,KAAA,KAAU,YAAA;AAAA,MAChB,MAAM,KAAA,KAAU,aAAA;AAAA,MAChB,KAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA;AAAA,MACA,eAAA;AAAA,MACA,aAAA,CAAc,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA;AAAA,MAC7B,aAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,eAAA;AAAA,MACA,iBAAA;AAAA,MACA,KAAA,CAAM,KAAA,KAAU,mBAAA,GAAsB,eAAA,GAAkB,MAAA;AAAA,MACxD,iBAAA;AAAA,MACA,iBAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACJ;AAGA,IAAA,MAAM,EAAA,GAAK,sBAAA,CAAuB,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA;AACjD,IAAA,IAAI,MAAM,MAAA,CAAO,IAAA,KAAS,MAAA,CAAO,CAAA,GAAI,OAAO,CAAA,EAAG;AAC3C,MAAA,gBAAA,CAAiB,GAAA,EAAK,OAAO,IAAA,GAAO,IAAA,GAAO,GAAG,MAAA,CAAO,CAAA,EAAG,QAAQ,KAAK,CAAA;AAAA,IACzE;AAAA,EACJ;AAMA,EAAA,IAAI,kBAAkB,IAAA,IAAQ,CAAC,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA,EAAG;AACvD,IAAA,MAAM,WAAW,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,aAAa,CAAA;AAC7D,IAAA,IAAI,QAAA,EAAU;AAOV,MAAA,MAAM,EAAA,GAAK,QAAA;AACX,MAAA,MAAM,SAAA,GAAY,CAAA,EAAG,QAAA,CAAS,KAAK,CAAA,SAAA,CAAA;AACnC,MAAA,MAAM,SAAA,GAAY,CAAA,EAAG,QAAA,CAAS,KAAK,CAAA,WAAA,CAAA;AAEnC,MAAA,MAAM,iBAAA,GAAoB,kBAAkB,QAAA,CAAS,KAAA;AACrD,MAAA,MAAM,UAAA,GACF,iBAAA,IAAqB,cAAA,KAAmB,IAAA,GAClC,iBACA,EAAA,CAAG,aAAA;AACb,MAAA,MAAM,UAAA,GACF,iBAAA,IAAqB,cAAA,KAAmB,IAAA,GAClC,iBACA,EAAA,CAAG,eAAA;AAEb,MAAA,IAAI,UAAA,KAAe,MAAA,IAAa,UAAA,KAAe,MAAA,EAAW;AACtD,QAAA,MAAM,GAAA,GAAM,KAAA,CAAM,QAAA,CAAS,UAAA,EAAY,YAAY,MAAM,CAAA;AACzD,QAAA,MAAM,GAAA,GAAM,KAAA,CAAM,QAAA,CAAS,UAAA,EAAY,YAAY,MAAM,CAAA;AACzD,QAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,eAAe,OAAA,GAAU,CAAA,GAAI,oBAAoB,CAAC,CAAA;AAC7E,QAAA,GAAA,CAAI,IAAA,EAAK;AACT,QAAA,GAAA,CAAI,IAAA,GAAO,YAAA;AACX,QAAA,MAAM,SAAA,GAAY,OAAA,GAAU,CAAA,GAAI,iBAAA,GAAoB,CAAA;AACpD,QAAA,MAAM,IAAA,GAAO,iBAAA,GAAoB,GAAA,CAAI,WAAA,CAAY,CAAA,GAAA,EAAM,UAAA,CAAW,OAAA,CAAQ,SAAS,CAAC,CAAA,CAAE,CAAA,CAAE,KAAA,GAAQ,iBAAA,GAAoB,SAAA;AACpH,QAAA,MAAM,IAAA,GAAO,iBAAA,GAAoB,GAAA,CAAI,WAAA,CAAY,CAAA,GAAA,EAAM,UAAA,CAAW,OAAA,CAAQ,SAAS,CAAC,CAAA,CAAE,CAAA,CAAE,KAAA,GAAQ,iBAAA,GAAoB,SAAA;AACpH,QAAA,GAAA,CAAI,OAAA,EAAQ;AACZ,QAAA,MAAM,UAAW,eAAA,CAAgB,GAAA,CAAI,SAAS,CAAA,IAAK,aAAa,IAAA,GAAO,CAAA,GAAI,CAAA,IAAA,CAAO,eAAA,CAAgB,IAAI,SAAS,CAAA,IAAK,SAAA,IAAa,IAAA,GAAO,IAAI,CAAA,CAAA,IAAM,CAAA;AAClJ,QAAA,MAAM,UAAU,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA,IAAM,MAAM,SAAA,GAAY,CAAA;AACpE,QAAA,MAAM,UAAU,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA,IAAM,MAAM,SAAA,GAAY,CAAA;AACpE,QAAA,MAAM,CAAC,MAAA,EAAQ,MAAM,CAAA,GAAI,OAAA,GAAU,OAAA,GAAU,CAAC,OAAA,EAAS,OAAO,CAAA,GAAI,CAAC,OAAA,EAAS,OAAO,CAAA;AACnF,QAAA,iBAAA,CAAkB,GAAA,EAAK,KAAA,EAAO,MAAA,GAAS,SAAA,EAAW,QAAQ,KAAK,CAAA;AAAA,MACnE;AAEA,MAAA,IAAI,eAAe,MAAA,EAAW;AAC1B,QAAA,eAAA;AAAA,UACI,GAAA;AAAA,UAAK,EAAA;AAAA,UAAyB,UAAA;AAAA,UAAY,UAAA;AAAA,UAC1C,KAAA;AAAA,UAAO,UAAA;AAAA,UAAY,MAAA;AAAA,UACnB,eAAA,CAAgB,GAAA,CAAI,SAAS,CAAA,IAAK,SAAA;AAAA,UAClC,MAAA;AAAA,UAAQ,KAAA;AAAA,UAAO,SAAA;AAAA,UAAW,aAAA;AAAA,UAAe,YAAA;AAAA,UACzC,QAAA;AAAA,UAAU,SAAA;AAAA,UAAW,iBAAA;AAAA,UAAmB,EAAA,CAAG,aAAA;AAAA,UAC3C,MAAA;AAAA,UAAW,WAAA;AAAA,UAAa,cAAA,CAAe,IAAI,SAAS;AAAA,SACxD;AAAA,MACJ;AACA,MAAA,IAAI,eAAe,MAAA,EAAW;AAC1B,QAAA,eAAA;AAAA,UACI,GAAA;AAAA,UAAK,EAAA;AAAA,UAAyB,YAAA;AAAA,UAAc,UAAA;AAAA,UAC5C,KAAA;AAAA,UAAO,UAAA;AAAA,UAAY,MAAA;AAAA,UACnB,eAAA,CAAgB,GAAA,CAAI,SAAS,CAAA,IAAK,SAAA;AAAA,UAClC,MAAA;AAAA,UAAQ,KAAA;AAAA,UAAO,SAAA;AAAA,UAAW,aAAA;AAAA,UAAe,YAAA;AAAA,UACzC,QAAA;AAAA,UAAU,SAAA;AAAA,UAAW,iBAAA;AAAA,UAAmB,EAAA,CAAG,aAAA;AAAA,UAC3C,MAAA;AAAA,UAAW,WAAA;AAAA,UAAa,cAAA,CAAe,IAAI,SAAS;AAAA,SACxD;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,EAAA,GAAA,CAAI,OAAA,EAAQ;AACZ,EAAA,OAAO;AAAA,IACH,QAAA;AAAA,IAAU,SAAA;AAAA,IAAW,UAAA;AAAA,IAAY,SAAA;AAAA,IAAW,YAAA;AAAA,IAC5C,eAAA;AAAA,IAAiB,iBAAA;AAAA,IAAmB,QAAA;AAAA,IACpC,gBAAA,EAAkB,kBAAkB,CAAC;AAAA,GACzC;AACJ;AAIA,IAAM,UAAA,GAAa,0CAAA;AACnB,IAAM,WAAA,GAAc,EAAA;AACpB,IAAM,OAAA,GAAU,EAAA;AAChB,IAAM,YAAA,GAAe,EAAA;AAMrB,SAAS,gBAAA,CACL,GAAA,EACA,OAAA,EACA,MAAA,EACA,OACA,iBAAA,EACI;AACJ,EAAA,MAAM,IAAA,GAAO,UAAU,KAAK,CAAA;AAC5B,EAAA,MAAM,MAAA,GAAS,CAAC,YAAA,CAAa,KAAA,CAAM,UAAU,CAAA;AAG7C,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAClB,EAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAClB,EAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,EAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,EAAA,KAAA,MAAW,CAAA,IAAK,QAAQ,OAAA,EAAS;AAC7B,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,CAAO,MAAA,EAAQ,CAAA,CAAE,CAAC,CAAA;AACtB,IAAA,GAAA,CAAI,MAAA,EAAO;AAAA,EACf;AACA,EAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,EAAA,GAAA,CAAI,OAAA,EAAQ;AAGZ,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,IAAA,GAAO,UAAA;AACX,EAAA,MAAM,MAAA,GAAS,uBAAA,CAAwB,OAAA,EAAS,MAAA,EAAQ,GAAG,CAAA;AAC3D,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,MAAK,GAAI,MAAA;AACzC,EAAA,MAAM,UAAA,GAAa,SAAA;AAGnB,EAAA,MAAM,OAAA,GAAU,SAAS,qBAAA,GAAwB,wBAAA;AACjD,EAAA,GAAA,CAAI,SAAA,GAAY,OAAA;AAChB,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,SAAA,CAAU,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,SAAS,YAAY,CAAA;AAC3D,EAAA,GAAA,CAAI,IAAA,EAAK;AAGT,EAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAClB,EAAA,GAAA,CAAI,WAAA,GAAc,GAAA;AAClB,EAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,EAAA,GAAA,CAAI,MAAA,EAAO;AACX,EAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AAGlB,EAAA,GAAA,CAAI,SAAA,GAAY,IAAA;AAChB,EAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAClB,EAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AACnB,EAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAChB,EAAA,GAAA,CAAI,SAAS,IAAA,GAAO,UAAA,EAAY,SAAS,WAAA,EAAa,MAAA,GAAS,UAAU,CAAC,CAAA;AAC1E,EAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AAClB,EAAA,GAAA,CAAI,OAAA,EAAQ;AAGZ,EAAA,iBAAA,CAAkB,IAAA,CAAK;AAAA,IACnB,WAAW,OAAA,CAAQ,EAAA;AAAA,IACnB,CAAA,EAAG,MAAA;AAAA,IACH,CAAA,EAAG,MAAA;AAAA,IACH,CAAA,EAAG,MAAA;AAAA,IACH,CAAA,EAAG;AAAA,GACN,CAAA;AACL;AAMA,SAAS,gBAAA,CACL,GAAA,EACA,UAAA,EACA,KAAA,EACA,QACA,KAAA,EACI;AACJ,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,UAAA,GAAa,KAAK,IAAI,CAAA,EAAG;AACtC,EAAA,MAAM,IAAA,GAAO,UAAU,KAAK,CAAA;AAC5B,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAClB,EAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAClB,EAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,EAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AAEtB,EAAA,MAAM,aAAa,MAAA,GAAS,CAAA;AAC5B,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,MAAA,CAAO,YAAY,UAAU,CAAA;AACjC,EAAA,GAAA,CAAI,MAAA,CAAO,YAAY,KAAK,CAAA;AAC5B,EAAA,GAAA,CAAI,MAAA,EAAO;AAEX,EAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,MAAA,CAAO,UAAA,GAAa,CAAA,EAAG,KAAK,CAAA;AAChC,EAAA,GAAA,CAAI,MAAA,CAAO,UAAA,GAAa,CAAA,EAAG,KAAK,CAAA;AAChC,EAAA,GAAA,CAAI,MAAA,EAAO;AACX,EAAA,GAAA,CAAI,OAAA,EAAQ;AAChB;AAEA,SAAS,iBAAA,CACL,GAAA,EACA,CAAA,EACA,IAAA,EACA,SACA,KAAA,EACI;AACJ,EAAA,IAAI,OAAA,GAAU,OAAO,CAAA,EAAG;AACxB,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,WAAA,GAAc,UAAU,KAAK,CAAA;AACjC,EAAA,GAAA,CAAI,WAAA,GAAc,GAAA;AAClB,EAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,EAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,MAAA,CAAO,GAAG,IAAI,CAAA;AAClB,EAAA,GAAA,CAAI,MAAA,CAAO,GAAG,OAAO,CAAA;AACrB,EAAA,GAAA,CAAI,MAAA,EAAO;AACX,EAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,EAAA,GAAA,CAAI,OAAA,EAAQ;AAChB;AAMA,SAAS,gBACL,GAAA,EACA,KAAA,EACA,GACA,IAAA,EACA,IAAA,EACA,OACA,SAAA,EACI;AAQJ,EAAA,MAAM,EAAA,GAAK,KAAA;AAEX,EAAA,MAAM,OAAmE,EAAC;AAI1E,EAAA,MAAM,QAAA,GAAW,KAAA;AACjB,EAAA,IAAI,EAAA,CAAG,cAAc,MAAA,EAAW;AAC5B,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,MAAM,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG,CAAA;AACnE,IAAA,IAAI,SAAS,aAAA,KAAkB,MAAA;AAC3B,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,SAAS,aAAA,CAAc,OAAA,CAAQ,SAAS,CAAA,EAAG,CAAA;AAC/E,IAAA,IAAI,SAAS,eAAA,KAAoB,MAAA;AAC7B,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,SAAS,eAAA,CAAgB,OAAA,CAAQ,SAAS,CAAA,EAAG,CAAA;AAAA,EACrF,CAAA,MAAO;AAEH,IAAA,IAAI,EAAA,CAAG,YAAY,MAAA,EAAW;AAC1B,MAAA,MAAM,QAAA,GACF,EAAA,CAAG,GAAA,KAAQ,MAAA,GACL,EAAA,CAAG,GAAA,IAAO,CAAA,GACN,KAAA,CAAM,MAAA,CAAO,EAAA,GACb,KAAA,CAAM,MAAA,CAAO,IAAA,GACjB,MAAA;AACV,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,KAAA,EAAO,KAAA,EAAO,OAAO,EAAA,CAAG,OAAA,EAAS,UAAU,CAAA;AAAA,IAC3D;AACA,IAAA,IAAI,EAAA,CAAG,SAAS,MAAA,EAAW;AACvB,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,GAAG,IAAA,KAAS,KAAA,GAAQ,KAAA,GAAQ,MAAA,EAAQ,CAAA;AAAA,IAC1E;AACA,IAAA,IAAI,EAAA,CAAG,SAAS,MAAA,EAAW;AACvB,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAO,MAAA,CAAO,EAAA,CAAG,IAAI,CAAA,EAAG,CAAA;AAAA,IACvD;AAEA,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACnB,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,MAAM,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG,CAAA;AAAA,IACvE;AAAA,EACJ;AAEA,EAAA,MAAM,KAAA,GAAQ,SAAA;AACd,EAAA,MAAM,KAAA,GAAQ,SAAA;AACd,EAAA,MAAM,WAAW,KAAA,GAAQ,CAAA;AAEzB,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,IAAA,GAAO,SAAA;AAGX,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAG,KAAK,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,CAAI,WAAA,CAAY,CAAA,CAAE,KAAK,CAAA,CAAE,KAAK,CAAC,CAAA;AAC1E,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAG,KAAK,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,CAAI,WAAA,CAAY,CAAA,CAAE,KAAK,CAAA,CAAE,KAAK,CAAC,CAAA;AAC1E,EAAA,MAAM,MAAA,GAAS,CAAA;AACf,EAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,MAAA,GAAS,MAAA,GAAS,MAAA,GAAS,KAAA;AAChD,EAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,IAAA,CAAK,MAAA,GAAS,WAAW,CAAA,GAAI,KAAA;AAGlD,EAAA,MAAM,QAAA,GAAW,OAAO,IAAA,GAAO,CAAA;AAC/B,EAAA,MAAM,OAAO,QAAA,GAAW,IAAA;AACxB,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,GAAO,CAAA;AAExB,EAAA,GAAA,CAAI,SAAA,GAAY,SAAA,CAAU,KAAA,EAAO,IAAI,CAAA;AACrC,EAAA,GAAA,CAAI,WAAA,GAAc,UAAU,KAAK,CAAA;AACjC,EAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,EAAA,SAAA,CAAU,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAM,UAAU,CAAA;AACjD,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,MAAA,EAAO;AAEX,EAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AACnB,EAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,EAAK,CAAA,KAAM;AACrB,IAAA,MAAM,IAAA,GAAO,IAAA,GAAO,KAAA,GAAQ,CAAA,GAAI,QAAA;AAChC,IAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAChB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAU,KAAK,CAAA;AAC/B,IAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAClB,IAAA,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,KAAA,EAAO,IAAA,GAAO,OAAO,IAAI,CAAA;AAC1C,IAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAY,OAAA;AAChB,IAAA,GAAA,CAAI,SAAA,GAAY,GAAA,CAAI,QAAA,IAAY,SAAA,CAAU,KAAK,CAAA;AAC/C,IAAA,GAAA,CAAI,QAAA,CAAS,IAAI,KAAA,EAAO,IAAA,GAAO,QAAQ,MAAA,GAAS,MAAA,GAAS,QAAQ,IAAI,CAAA;AAAA,EACzE,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,OAAA,EAAQ;AAChB;AAEA,SAAS,UACL,GAAA,EACA,KAAA,EACA,MAAA,EACA,MAAA,EACA,QACA,KAAA,EACA,SAAA,EACA,OAAA,EACA,QAAA,EACA,OACA,UAAA,EACA,MAAA,EACA,eACA,YAAA,EACA,eAAA,EACA,mBACA,aAAA,EACA,QAAA,EACA,SAAA,EACA,UAAA,EACA,WACA,YAAA,EACA,eAAA,EACA,iBAAA,GAA6B,KAAA,EAC7B,iBACA,iBAAA,GAA6B,KAAA,EAC7B,iBAAA,EAEA,cAAA,GAAgC,MAEhC,cAAA,GAAgC,IAAA,EAEhC,cAAsB,CAAA,EAEtB,cAAA,EAEA,qBAA8B,KAAA,EAC1B;AACJ,EAAA,MAAM,EAAE,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,MAAK,GAAI,MAAA;AAChC,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,EAAO,MAAA,EAAQ,KAAK,CAAA;AAC7C,EAAA,MAAM,SAAS,OAAA,IAAW,QAAA;AAG1B,EAAA,MAAM,kBAAA,GAAqB,sBAAsB,CAAC,MAAA;AAClD,EAAA,MAAM,6BAA6B,iBAAA,IAAqB,kBAAA;AAGxD,EAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,WAAA,EAAa,CAAC,GAAG,CAAC,CAAA;AAC9C,EAAA,MAAM,SAAS,OAAA,GAAU,CAAA;AACzB,EAAA,MAAM,QAAQ,MAAA,GAAS,CAAA;AACvB,EAAA,MAAM,WAAW,SAAA,GAAY,CAAA;AAC7B,EAAA,MAAM,UAAU,QAAA,GAAW,CAAA;AAC3B,EAAA,MAAM,aAAa,WAAA,GAAc,CAAA;AAIjC,EAAA,IAAI,kBAAkB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,UAAA,IAAc,CAAC,QAAA,EAAU;AACnE,IAAA,MAAM,IAAA,GAAO,CAAA;AACb,IAAA,MAAM,IAAA,GAAO,SAAS,IAAA,GAAO,CAAA;AAG7B,IAAA,IAAI,OAAA,EAAS;AACT,MAAA,eAAA,CAAgB,KAAK,KAAA,EAAO,CAAA,EAAG,IAAA,EAAM,IAAA,EAAM,OAAO,SAAS,CAAA;AAAA,IAC/D;AAEA,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,IAAA,GAAA,CAAI,WAAA,GAAc,UAAU,CAAA,GAAI,IAAA;AAChC,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,IAAI,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACrC,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AAClB,IAAA,GAAA,CAAI,OAAA,EAAQ;AAEZ,IAAA,UAAA,CAAW,IAAA,CAAK;AAAA,MACZ,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,MAAM,IAAA,GAAO,IAAA;AAAA,MACb,MAAM,CAAA,GAAI,IAAA;AAAA,MACV,MAAM,IAAA,GAAO,CAAA;AAAA,MACb,MAAM,IAAA,GAAO,CAAA;AAAA,MACb,OAAO,IAAA,GAAO,IAAA;AAAA,MACd,OAAO,CAAA,GAAI,IAAA;AAAA,MACX,OAAO,IAAA,GAAO,CAAA;AAAA,MACd,OAAO,IAAA,GAAO;AAAA,KACjB,CAAA;AACD,IAAA;AAAA,EACJ;AAEA,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAA,GAAK,MAA8B,OAAA,GAAU,IAAA;AACzE,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,KAAS,UAAA,GAAc,MAA2B,GAAA,GAAM,MAAA;AAC1E,EAAA,MAAM,SAAA,GAAY,MAAM,IAAA,KAAS,SAAA;AAGjC,EAAA,MAAM,gBACF,SAAA,IACC,KAAA,CAA4B,cAAc,QAAA,IAC1C,KAAA,CAAM,MAA6C,QAAA,KAAa,IAAA;AAErE,EAAA,MAAM,SAAA,GAAY,YAAY,KAAK,CAAA;AAEnC,EAAA,MAAM,MAAA,GAAA,CAAU,SAAA,GAAY,MAAA,GAAS,CAAA,GAAI,CAAA,IAAK,IAAA;AAC9C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAA,CAAO,MAAA,GAAS,UAAU,CAAC,CAAA;AAC/C,EAAA,MAAM,KAAA,GAAQ,YAAY,MAAA,GAAS,CAAA;AACnC,EAAA,MAAM,IAAA,GAAO,SAAA,GAAY,MAAA,GAAS,MAAA,GAAS,CAAA,GAAI,MAAA;AAU/C,EAAA,MAAM,WAAA,GAAc,KAAA;AAKpB,EAAA,IAAI,MAAA,IAAU,iBAAiB,kBAAA,EAAoB;AAC/C,IAAA,MAAM,SAAA,GAAY,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,SAAA,CAAA;AAChC,IAAA,MAAM,SAAA,GAAY,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,WAAA,CAAA;AAIhC,IAAA,MAAM,cAAA,GAAiB,kBAAkB,KAAA,CAAM,KAAA;AAC/C,IAAA,MAAM,aAAA,GACF,cAAA,IAAkB,cAAA,KAAmB,IAAA,GAC/B,iBACA,WAAA,CAAY,aAAA;AACtB,IAAA,MAAM,aAAA,GACF,cAAA,IAAkB,cAAA,KAAmB,IAAA,GAC/B,iBACA,WAAA,CAAY,eAAA;AAGtB,IAAA,IAAI,QAAA,IAAY,aAAA,KAAkB,MAAA,IAAa,aAAA,KAAkB,MAAA,EAAW;AACxE,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,QAAA,CAAS,aAAA,EAAe,YAAY,MAAM,CAAA;AAC5D,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,QAAA,CAAS,aAAA,EAAe,YAAY,MAAM,CAAA;AAC5D,MAAA,MAAM,SAAA,GAAY,oBACZ,aAAA,GACA,IAAA,CAAK,IAAI,aAAA,EAAe,MAAA,GAAS,CAAA,GAAI,iBAAA,GAAoB,CAAC,CAAA;AAChE,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,IAAA,GAAO,YAAA;AACX,MAAA,MAAM,SAAA,GAAY,iBAAA,GAAoB,CAAA,GAAI,MAAA,GAAS,IAAI,iBAAA,GAAoB,CAAA;AAC3E,MAAA,MAAM,IAAA,GAAO,iBAAA,GAAoB,GAAA,CAAI,WAAA,CAAY,CAAA,GAAA,EAAM,aAAA,CAAc,OAAA,CAAQ,SAAS,CAAC,CAAA,CAAE,CAAA,CAAE,KAAA,GAAQ,iBAAA,GAAoB,SAAA;AACvH,MAAA,MAAM,IAAA,GAAO,iBAAA,GAAoB,GAAA,CAAI,WAAA,CAAY,CAAA,GAAA,EAAM,aAAA,CAAc,OAAA,CAAQ,SAAS,CAAC,CAAA,CAAE,CAAA,CAAE,KAAA,GAAQ,iBAAA,GAAoB,SAAA;AACvH,MAAA,GAAA,CAAI,OAAA,EAAQ;AACZ,MAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,GAAA,CAAI,SAAS,KAAK,MAAA,GAAS,kBAAA;AAC5D,MAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,GAAA,CAAI,SAAS,KAAK,MAAA,GAAS,kBAAA;AAC5D,MAAA,MAAM,KAAA,GAAA,CAAU,WAAW,IAAA,GAAO,CAAA,GAAI,KAAM,QAAA,GAAW,IAAA,GAAO,IAAI,CAAA,CAAA,IAAM,CAAA;AACxE,MAAA,MAAM,UAAU,cAAA,EAAgB,GAAA,CAAI,SAAS,CAAA,IAAM,MAAM,SAAA,GAAY,CAAA;AACrE,MAAA,MAAM,UAAU,cAAA,EAAgB,GAAA,CAAI,SAAS,CAAA,IAAM,MAAM,SAAA,GAAY,CAAA;AACrE,MAAA,MAAM,CAAC,MAAA,EAAQ,MAAM,CAAA,GAAI,OAAA,GAAU,OAAA,GAAU,CAAC,OAAA,EAAS,OAAO,CAAA,GAAI,CAAC,OAAA,EAAS,OAAO,CAAA;AACnF,MAAA,iBAAA,CAAkB,GAAA,EAAK,KAAA,EAAO,MAAA,GAAS,SAAA,EAAW,QAAQ,KAAK,CAAA;AAAA,IACnE;AAEA,IAAA,IAAI,kBAAkB,MAAA,EAAW;AAC7B,MAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,GAAA,CAAI,SAAS,KAAK,MAAA,GAAS,kBAAA;AAC1D,MAAA,eAAA;AAAA,QACI,GAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA;AAAA,QACA,aAAA;AAAA,QACA,KAAA;AAAA,QACA,UAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAA;AAAA,QACA,aAAA;AAAA,QACA,YAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA;AAAA,QACA,0BAAA;AAAA,QACA,WAAA,CAAY,aAAA;AAAA,QACZ,eAAA,EAAiB,EAAA;AAAA,QACjB,WAAA;AAAA,QACA,cAAA,EAAgB,IAAI,SAAS;AAAA,OACjC;AAAA,IACJ,CAAA,MAAA,IAAW,aAAA,KAAkB,SAAA,IAAa,YAAA,KAAiB,IAAA,EAAM;AAE7D,MAAA,MAAM,SAAS,MAAA,GAAS,kBAAA;AACxB,MAAA,eAAA;AAAA,QACI,GAAA;AAAA,QACA,WAAA;AAAA,QACA,UAAA;AAAA,QACA,YAAA;AAAA,QACA,KAAA;AAAA,QACA,UAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAA;AAAA,QACA,aAAA;AAAA,QACA,YAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA;AAAA,QACA,0BAAA;AAAA,QACA,MAAA;AAAA,QACA,eAAA,EAAiB,EAAA;AAAA,QACjB;AAAA,OACJ;AAAA,IACJ;AAEA,IAAA,IAAI,kBAAkB,MAAA,EAAW;AAC7B,MAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,GAAA,CAAI,SAAS,KAAK,MAAA,GAAS,kBAAA;AAC1D,MAAA,eAAA;AAAA,QACI,GAAA;AAAA,QACA,WAAA;AAAA,QACA,YAAA;AAAA,QACA,aAAA;AAAA,QACA,KAAA;AAAA,QACA,UAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAA;AAAA,QACA,aAAA;AAAA,QACA,YAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA;AAAA,QACA,0BAAA;AAAA,QACA,WAAA,CAAY,aAAA;AAAA,QACZ,eAAA,EAAiB,EAAA;AAAA,QACjB,WAAA;AAAA,QACA,cAAA,EAAgB,IAAI,SAAS;AAAA,OACjC;AAAA,IACJ,CAAA,MAAA,IAAW,aAAA,KAAkB,SAAA,IAAa,YAAA,KAAiB,IAAA,EAAM;AAE7D,MAAA,MAAM,SAAS,MAAA,GAAS,kBAAA;AACxB,MAAA,eAAA;AAAA,QACI,GAAA;AAAA,QACA,WAAA;AAAA,QACA,YAAA;AAAA,QACA,YAAA;AAAA,QACA,KAAA;AAAA,QACA,UAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAA;AAAA,QACA,aAAA;AAAA,QACA,YAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA;AAAA,QACA,0BAAA;AAAA,QACA,MAAA;AAAA,QACA,eAAA,EAAiB,EAAA;AAAA,QACjB;AAAA,OACJ;AAAA,IACJ;AAGA,IAAA,IAAI,QAAA,IAAY,WAAA,CAAY,IAAA,KAAS,MAAA,EAAW;AAC5C,MAAA,MAAM,WAAW,MAAA,GAAS,kBAAA;AAC1B,MAAA,IAAI,WAAA,CAAY,aAAA,KAAkB,MAAA,IAAa,aAAA,KAAkB,SAAA,EAAW;AACxE,QAAA,oBAAA;AAAA,UACI,GAAA;AAAA,UACA,WAAA;AAAA,UACA,UAAA;AAAA,UACA,CAAA;AAAA,UACA,QAAA;AAAA,UACA,MAAA;AAAA,UACA,MAAA;AAAA,UACA,KAAA;AAAA,UACA;AAAA,SACJ;AAAA,MACJ;AACA,MAAA,IAAI,WAAA,CAAY,eAAA,KAAoB,MAAA,IAAa,aAAA,KAAkB,SAAA,EAAW;AAC1E,QAAA,oBAAA;AAAA,UACI,GAAA;AAAA,UACA,WAAA;AAAA,UACA,YAAA;AAAA,UACA,CAAA;AAAA,UACA,QAAA;AAAA,UACA,MAAA;AAAA,UACA,MAAA;AAAA,UACA,KAAA;AAAA,UACA;AAAA,SACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAGA,EAAA,IAAI,aAAA,EAAe;AAGnB,EAAA,MAAM,eAAA,GAAkB,KAAA,CAAM,IAAA,KAAS,UAAA,IAAe,MAAwB,kBAAA,KAAuB,IAAA;AACrG,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,EAAA,GAAA,CAAI,SAAA,GAAY,UAAA;AAChB,EAAA,GAAA,CAAI,WAAA,GAAc,SAAS,CAAA,GAAM,IAAA;AAEjC,EAAA,IAAI,aAAa,eAAA,EAAiB;AAC9B,IAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,EAC1B;AAEA,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AACf,EAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAC,CAAA;AACpB,EAAA,GAAA,CAAI,MAAA,EAAO;AACX,EAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,EAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AAClB,EAAA,GAAA,CAAI,OAAA,EAAQ;AAGZ,EAAA,MAAM,IAAA,GAAO,OAAO,IAAA,GAAO,CAAA;AAE3B,EAAA,GAAA,CAAI,IAAA,EAAK;AAGT,EAAA,GAAA,CAAI,SAAA,GAAY,SAAA,CAAU,KAAA,EAAO,MAAM,CAAA;AACvC,EAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,EAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,EAAA,SAAA,CAAU,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAM,UAAU,CAAA;AACjD,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,MAAA,EAAO;AAGX,EAAA,IAAI,QAAQ,IAAA,GAAO,SAAA;AACnB,EAAA,MAAM,YAAA,GAAgB,KAAA,CAAM,IAAA,EAA6C,QAAA,KAAa,IAAA;AACtF,EAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,IAAA,KAAS,SAAA,IAAa,eAAA;AACrD,EAAA,MAAM,YAAa,KAAA,CAA4C,IAAA;AAC/D,EAAA,MAAM,cAAc,iBAAA,KAAsB,YAAA,IAAgB,QAAA,IAAY,iBAAA,CAAA,IAAsB,oBAAoB,SAAA,KAAc,MAAA;AAC9H,EAAA,IAAI,WAAA,EAAa;AACb,IAAA,MAAM,OAAA,GAAU,OAAO,SAAS,CAAA;AAChC,IAAA,GAAA,CAAI,IAAA,GAAO,SAAA;AACX,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,WAAA,CAAY,OAAO,CAAA,CAAE,KAAA;AAC9C,IAAA,MAAM,KAAA,GAAQ,aAAa,YAAA,GAAe,UAAA;AAC1C,IAAA,MAAM,KAAA,GAAQ,KAAA;AAGd,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,WAAA,GAAc,UAAU,KAAK,CAAA;AACjC,IAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,KAAA,GAAQ,KAAA,EAAO,IAAA,GAAO,CAAC,CAAA;AAClC,IAAA,GAAA,CAAI,MAAA,CAAO,KAAA,GAAQ,KAAA,EAAO,IAAA,GAAO,OAAO,CAAC,CAAA;AACzC,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,OAAA,EAAQ;AAEZ,IAAA,GAAA,CAAI,SAAA,GAAY,UAAU,KAAK,CAAA;AAC/B,IAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAChB,IAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AACnB,IAAA,GAAA,CAAI,QAAA,CAAS,OAAA,EAAS,KAAA,GAAQ,UAAA,EAAY,IAAI,CAAA;AAG9C,IAAA,iBAAA,EAAmB,IAAA,CAAK,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,CAAA;AACtF,IAAA,KAAA,IAAS,KAAA,GAAQ,QAAA;AAAA,EACrB;AAGA,EAAA,IAAI,OAAA,EAAS;AACT,IAAA,MAAM,QAAA,GACF,GAAA,KAAQ,MAAA,GAAa,GAAA,IAAO,CAAA,GAAI,KAAA,CAAM,MAAA,CAAO,EAAA,GAAK,KAAA,CAAM,MAAA,CAAO,IAAA,GAAQ,SAAA,CAAU,KAAK,CAAA;AAC1F,IAAA,GAAA,CAAI,IAAA,GAAO,QAAA;AACX,IAAA,GAAA,CAAI,SAAA,GAAY,QAAA;AAChB,IAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAChB,IAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AACnB,IAAA,GAAA,CAAI,QAAA,CAAS,OAAA,EAAS,KAAA,EAAO,IAAI,CAAA;AACjC,IAAA,KAAA,IAAS,GAAA,CAAI,WAAA,CAAY,OAAO,CAAA,CAAE,KAAA,GAAQ,OAAA;AAAA,EAC9C;AAGA,EAAA,MAAM,cAAc,mBAAA,CAAoB,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,WAAW,WAAW,CAAA;AACnF,EAAA,GAAA,CAAI,IAAA,GAAO,SAAA;AACX,EAAA,GAAA,CAAI,SAAA,GAAY,UAAU,KAAK,CAAA;AAC/B,EAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAChB,EAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AACnB,EAAA,GAAA,CAAI,QAAA,CAAS,WAAA,EAAa,KAAA,EAAO,IAAI,CAAA;AAErC,EAAA,MAAM,IAAA,GAAO,IAAA;AACb,EAAA,MAAM,CAAA,GAAI,GAAA;AAEV,EAAA,IAAI,CAAC,qBAAqB,iBAAA,EAAmB;AAEzC,IAAA,MAAM,OAAA,GAAU,IAAA,GAAO,IAAA,GAAO,SAAA,GAAY,CAAA,GAAI,QAAA;AAC9C,IAAA,MAAM,QAAA,GAAW,OAAA,GAAU,QAAA,GAAW,UAAA,GAAa,QAAA;AAGnD,IAAA,GAAA,CAAI,SAAA,GAAY,MAAM,MAAA,CAAO,EAAA;AAC7B,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,IAAI,QAAA,EAAU,IAAA,EAAM,UAAU,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AAChD,IAAA,GAAA,CAAI,IAAA,EAAK;AAET,IAAA,GAAA,CAAI,cAAc,KAAA,CAAM,UAAA;AACxB,IAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,IAAA,GAAA,CAAI,OAAA,GAAU,OAAA;AACd,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AACf,IAAA,MAAM,EAAA,GAAK,GAAA;AACX,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,QAAA,GAAW,EAAA,EAAI,IAAI,CAAA;AAC9B,IAAA,GAAA,CAAI,OAAO,QAAA,GAAW,EAAA,GAAK,GAAA,EAAK,IAAA,GAAO,KAAK,GAAG,CAAA;AAC/C,IAAA,GAAA,CAAI,MAAA,CAAO,QAAA,GAAW,EAAA,EAAI,IAAA,GAAO,KAAK,GAAG,CAAA;AACzC,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,GAAA,CAAI,SAAA,GAAY,MAAM,MAAA,CAAO,IAAA;AAC7B,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,IAAI,OAAA,EAAS,IAAA,EAAM,UAAU,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AAC/C,IAAA,GAAA,CAAI,IAAA,EAAK;AAET,IAAA,GAAA,CAAI,cAAc,KAAA,CAAM,UAAA;AACxB,IAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,IAAA,GAAA,CAAI,OAAA,GAAU,OAAA;AACd,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,OAAA,GAAU,CAAA,EAAG,IAAA,GAAO,CAAC,CAAA;AAChC,IAAA,GAAA,CAAI,MAAA,CAAO,OAAA,GAAU,CAAA,EAAG,IAAA,GAAO,CAAC,CAAA;AAChC,IAAA,GAAA,CAAI,MAAA,CAAO,OAAA,GAAU,CAAA,EAAG,IAAA,GAAO,CAAC,CAAA;AAChC,IAAA,GAAA,CAAI,MAAA,CAAO,OAAA,GAAU,CAAA,EAAG,IAAA,GAAO,CAAC,CAAA;AAChC,IAAA,GAAA,CAAI,MAAA,EAAO;AAEX,IAAA,YAAA,CAAa,IAAA,CAAK;AAAA,MACd,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,MAAA,EAAQ,SAAA;AAAA,MACR,GAAG,QAAA,GAAW,QAAA;AAAA,MACd,GAAG,IAAA,GAAO,QAAA;AAAA,MACV,GAAG,QAAA,GAAW,CAAA;AAAA,MACd,GAAG,QAAA,GAAW;AAAA,KACjB,CAAA;AACD,IAAA,YAAA,CAAa,IAAA,CAAK;AAAA,MACd,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,MAAA,EAAQ,QAAA;AAAA,MACR,GAAG,OAAA,GAAU,QAAA;AAAA,MACb,GAAG,IAAA,GAAO,QAAA;AAAA,MACV,GAAG,QAAA,GAAW,CAAA;AAAA,MACd,GAAG,QAAA,GAAW;AAAA,KACjB,CAAA;AAAA,EACL,CAAA,MAAA,IAAW,CAAC,iBAAA,EAAmB;AAE3B,IAAA,MAAM,MAAA,GAAS,IAAA,GAAO,IAAA,GAAO,SAAA,GAAY,CAAA,GAAI,MAAA;AAE7C,IAAA,MAAM,KAAA,GAAQ,MAAA,GAAS,MAAA,GAAS,OAAA,GAAU,KAAA;AAG1C,IAAA,GAAA,CAAI,SAAA,GAAY,UAAU,KAAK,CAAA;AAC/B,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,IAAI,KAAA,EAAO,IAAA,EAAM,OAAO,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AAC1C,IAAA,GAAA,CAAI,IAAA,EAAK;AAGT,IAAA,MAAM,KAAK,KAAA,GAAQ,IAAA;AACnB,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,KAAA,CAAM,UAAA;AACxB,IAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,IAAA,GAAA,CAAI,OAAA,GAAU,OAAA;AACd,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AACf,IAAA,GAAA,CAAI,SAAA,CAAU,OAAO,IAAI,CAAA;AACzB,IAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAEtB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,CAAC,EAAA,GAAK,IAAA,EAAM,CAAC,EAAE,CAAA;AAC1B,IAAA,GAAA,CAAI,MAAA,CAAO,CAAC,EAAA,GAAK,IAAA,EAAM,KAAK,GAAG,CAAA;AAC/B,IAAA,GAAA,CAAI,MAAA,CAAO,EAAA,GAAK,IAAA,EAAM,EAAA,GAAK,GAAG,CAAA;AAC9B,IAAA,GAAA,CAAI,MAAA,CAAO,EAAA,GAAK,IAAA,EAAM,CAAC,EAAE,CAAA;AACzB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,EAAO;AAEX,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,CAAC,EAAA,GAAK,IAAA,EAAM,KAAK,GAAG,CAAA;AAC/B,IAAA,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,EAAA,GAAK,EAAA,GAAK,IAAI,CAAA;AAC5B,IAAA,GAAA,CAAI,MAAA,CAAO,EAAA,GAAK,IAAA,EAAM,EAAA,GAAK,GAAG,CAAA;AAC9B,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,OAAA,EAAQ;AAGZ,IAAA,GAAA,CAAI,SAAA,GAAY,UAAU,KAAK,CAAA;AAC/B,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,IAAI,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AAC5C,IAAA,GAAA,CAAI,IAAA,EAAK;AAET,IAAA,GAAA,CAAI,cAAc,KAAA,CAAM,UAAA;AACxB,IAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,IAAA,GAAA,CAAI,OAAA,GAAU,OAAA;AACd,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,IAAA,GAAO,CAAC,CAAA;AAC/B,IAAA,GAAA,CAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,IAAA,GAAO,CAAC,CAAA;AAC/B,IAAA,GAAA,CAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,IAAA,GAAO,CAAC,CAAA;AAC/B,IAAA,GAAA,CAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,IAAA,GAAO,CAAC,CAAA;AAC/B,IAAA,GAAA,CAAI,MAAA,EAAO;AAEX,IAAA,SAAA,CAAU,IAAA,CAAK;AAAA,MACX,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,GAAG,KAAA,GAAQ,KAAA;AAAA,MACX,GAAG,IAAA,GAAO,KAAA;AAAA,MACV,GAAG,KAAA,GAAQ,CAAA;AAAA,MACX,GAAG,KAAA,GAAQ;AAAA,KACd,CAAA;AACD,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACV,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,GAAG,MAAA,GAAS,MAAA;AAAA,MACZ,GAAG,IAAA,GAAO,MAAA;AAAA,MACV,GAAG,MAAA,GAAS,CAAA;AAAA,MACZ,GAAG,MAAA,GAAS;AAAA,KACf,CAAA;AAAA,EACL;AAEA,EAAA,GAAA,CAAI,OAAA,EAAQ;AAGZ,EAAA,IAAI,SAAA,EAAW;AACX,IAAA,cAAA,CAAe,GAAA,EAAK,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,QAAQ,OAAO,CAAA;AAKtD,IAAA,MAAM,UAAA,GAAa,oBAAoB,CAAA,GAAI,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,GAAS,IAAI,SAAA,GAAY,CAAA;AAC1F,IAAA,SAAA,CAAU,IAAA,CAAK;AAAA,MACX,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,CAAA,EAAG,KAAA;AAAA,MACH,CAAA,EAAG,IAAA;AAAA,MACH,CAAA,EAAG,MAAA,GAAS,CAAA,GAAI,IAAA,GAAO,UAAA;AAAA,MACvB,CAAA,EAAG,IAAA;AAAA,MACH,SAAA,EAAW,KAAA;AAAA,MACX,KAAA,EAAO;AAAA,KACV,CAAA;AAED,IAAA,SAAA,CAAU,IAAA,CAAK;AAAA,MACX,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,CAAA,EAAG,CAAA;AAAA,MACH,GAAG,CAAA,GAAI,CAAA;AAAA,MACP,CAAA,EAAG,MAAA;AAAA,MACH,CAAA,EAAG,CAAA;AAAA,MACH,SAAA,EAAW;AAAA,KACd,CAAA;AAAA,EACL,CAAA,MAAA,IAAW,iBAAA,IAAqB,IAAA,GAAO,CAAA,EAAG;AAGtC,IAAA,SAAA,CAAU,IAAA,CAAK;AAAA,MACX,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,CAAA,EAAG,IAAA;AAAA,MACH,CAAA,EAAG,IAAA;AAAA,MACH,CAAA,EAAG,IAAA;AAAA,MACH,CAAA,EAAG,IAAA;AAAA,MACH,SAAA,EAAW,KAAA;AAAA,MACX,KAAA,EAAO;AAAA,KACV,CAAA;AAAA,EACL;AAEA,EAAA,UAAA,CAAW,IAAA,CAAK;AAAA,IACZ,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,IAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA,EAAO,CAAA;AAAA,IACP,OAAO,CAAA,GAAI,CAAA;AAAA,IACX,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACV,CAAA;AACL;AAEA,SAAS,oBAAA,CACL,KACA,KAAA,EACA,WAAA,EACA,QACA,YAAA,EACA,MAAA,EACA,MAAA,EACA,KAAA,EACA,eAAA,EACI;AAEJ,EAAA,MAAM,UAAA,GACD,MAAM,IAAA,KAAS,KAAA,IAAS,gBAAgB,UAAA,IACxC,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,WAAA,KAAgB,YAAA;AAC9C,EAAA,MAAM,IAAA,GAAO,MAAA,IAAU,UAAA,GAAa,yBAAA,GAA4B,CAAC,yBAAA,CAAA;AACjE,EAAA,IAAI,IAAA,GAAO,CAAA,IAAK,IAAA,GAAO,MAAA,EAAQ;AAG/B,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,WAAA,GAAc,UAAU,KAAK,CAAA;AACjC,EAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,EAAA,GAAA,CAAI,WAAA,GAAc,GAAA;AAClB,EAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,MAAA,CAAO,cAAc,IAAI,CAAA;AAC7B,EAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,IAAI,CAAA;AACvB,EAAA,GAAA,CAAI,MAAA,EAAO;AACX,EAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,EAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AAClB,EAAA,GAAA,CAAI,OAAA,EAAQ;AAGZ,EAAA,MAAM,SAAA,GAAY,WAAA,KAAgB,UAAA,GAAa,KAAA,GAAQ,KAAA;AACvD,EAAA,GAAA,CAAI,IAAA,GAAO,YAAA;AACX,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,WAAA,CAAY,SAAS,CAAA,CAAE,KAAA;AACzC,EAAA,MAAM,EAAA,GAAK,oBAAoB,KAAA,GAAQ,iBAAA;AACvC,EAAA,MAAM,EAAA,GAAK,aAAA;AACX,EAAA,MAAM,EAAA,GAAK,eAAe,EAAA,GAAK,CAAA;AAC/B,EAAA,MAAM,EAAA,GAAK,OAAO,EAAA,GAAK,CAAA;AAEvB,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAClB,EAAA,GAAA,CAAI,SAAA,GAAY,SAAA,CAAU,KAAA,EAAO,KAAK,CAAA;AACtC,EAAA,GAAA,CAAI,WAAA,GAAc,UAAU,KAAK,CAAA;AACjC,EAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,EAAA,SAAA,CAAU,GAAA,EAAK,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAI,UAAU,CAAA;AACzC,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,MAAA,EAAO;AACX,EAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AAClB,EAAA,GAAA,CAAI,SAAA,GAAY,UAAU,KAAK,CAAA;AAC/B,EAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAChB,EAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AACnB,EAAA,GAAA,CAAI,QAAA,CAAS,SAAA,EAAW,EAAA,GAAK,iBAAA,EAAmB,IAAI,CAAA;AACpD,EAAA,GAAA,CAAI,OAAA,EAAQ;AAEZ,EAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,IACjB,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,WAAA;AAAA,IACA,CAAA,EAAG,EAAA;AAAA,IACH,CAAA,EAAG,EAAA;AAAA,IACH,CAAA,EAAG,EAAA;AAAA,IACH,CAAA,EAAG;AAAA,GACN,CAAA;AACL;AAEA,SAAS,eAAA,CACL,KACA,KAAA,EACA,WAAA,EACA,cACA,KAAA,EACA,UAAA,EACA,QACA,YAAA,EACA,MAAA,EACA,OACA,SAAA,EACA,aAAA,EACA,cACA,QAAA,EACA,SAAA,EACA,mBACA,iBAAA,EACA,OAAA,EAEA,WAAA,GAAsB,CAAA,EAOtB,YAAA,EACI;AACJ,EAAA,MAAM,MAAA,GAAS,UAAU,IAAA,CAAK,GAAA,CAAI,KAAK,GAAA,CAAI,WAAA,EAAa,CAAC,CAAA,EAAG,CAAC,CAAA;AAC7D,EAAA,MAAM,iBAAiB,aAAA,KAAkB,CAAA,EAAG,KAAA,CAAM,KAAK,IAAI,WAAW,CAAA,CAAA;AACtE,EAAA,MAAM,KAAA,GAAQ,cAAA,IAAkB,YAAA,KAAiB,IAAA,GAAO,YAAA,GAAe,YAAA;AAEvE,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,KAAA,EAAO,YAAY,MAAM,CAAA;AAClD,EAAA,IAAI,CAAA,GAAI,GAAA,IAAO,CAAA,GAAI,MAAA,GAAS,EAAA,EAAI;AAGhC,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,WAAA,GAAc,UAAU,KAAK,CAAA;AACjC,EAAA,GAAA,CAAI,SAAA,GAAY,cAAA;AAChB,EAAA,GAAA,CAAI,WAAA,GAAc,GAAA;AAClB,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,MAAA,CAAO,cAAc,CAAC,CAAA;AAC1B,EAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAC,CAAA;AACpB,EAAA,GAAA,CAAI,MAAA,EAAO;AACX,EAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AAMlB,EAAA,MAAM,SAAA,GAAY,WAAA,KAAgB,UAAA,GAAa,IAAA,GAAO,IAAA;AACtD,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA;AACxC,EAAA,MAAM,QAAA,GAAW,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAEzC,EAAA,GAAA,CAAI,IAAA,GAAO,YAAA;AACX,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,WAAA,CAAY,QAAQ,CAAA,CAAE,KAAA;AACxC,EAAA,MAAM,OAAO,OAAA,GAAU,GAAA,CAAI,YAAY,OAAO,CAAA,CAAE,QAAQ,iBAAA,GAAoB,CAAA;AAC5E,EAAA,MAAM,SAAA,GAAY,iBAAA,GAAoB,CAAA,GAAI,MAAA,GAAS,IAAI,iBAAA,GAAoB,CAAA;AAC3E,EAAA,MAAM,EAAA,GAAK,iBAAA,GAAoB,KAAA,GAAQ,IAAA,GAAO,iBAAA,GAAoB,SAAA;AAClE,EAAA,MAAM,EAAA,GAAK,oBAAoB,aAAA,GAAgB,IAAA,CAAK,IAAI,aAAA,EAAe,MAAA,GAAS,CAAA,GAAI,iBAAA,GAAoB,CAAC,CAAA;AACzG,EAAA,MAAM,EAAA,GAAK,eAAe,EAAA,GAAK,CAAA;AAC/B,EAAA,MAAM,WAAA,GAAc,IAAI,EAAA,GAAK,CAAA;AAC7B,EAAA,MAAM,KAAK,YAAA,IAAgB,WAAA;AAC3B,EAAA,MAAM,UAAA,GAAa,KAAK,EAAA,GAAK,CAAA;AAC7B,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,WAAW,CAAA,IAAK,CAAA;AAGhD,EAAA,IAAI,SAAA,EAAW;AACX,IAAA,iBAAA,CAAkB,KAAK,EAAA,GAAK,EAAA,GAAK,CAAA,EAAG,UAAA,EAAY,GAAG,KAAK,CAAA;AAAA,EAC5D;AAEA,EAAA,GAAA,CAAI,SAAA,GAAY,SAAA,CAAU,KAAA,EAAO,KAAK,CAAA;AACtC,EAAA,GAAA,CAAI,WAAA,GAAc,UAAU,KAAK,CAAA;AACjC,EAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,EAAA,SAAA,CAAU,GAAA,EAAK,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAI,UAAU,CAAA;AACzC,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,MAAA,EAAO;AAEX,EAAA,GAAA,CAAI,SAAA,GAAY,UAAU,KAAK,CAAA;AAC/B,EAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAChB,EAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AACnB,EAAA,GAAA,CAAI,QAAA,CAAS,QAAA,EAAU,EAAA,GAAK,iBAAA,EAAmB,UAAU,CAAA;AAGzD,EAAA,IAAI,OAAA,EAAS;AACT,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,EAAK,CAAE,WAAW,GAAG,CAAA;AAC5C,IAAA,GAAA,CAAI,YAAY,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,IAAA,GAAO,MAAM,MAAA,CAAO,EAAA;AAC1D,IAAA,GAAA,CAAI,SAAS,OAAA,EAAS,EAAA,GAAK,iBAAA,GAAoB,KAAA,GAAQ,mBAAmB,UAAU,CAAA;AAAA,EACxF;AAEA,EAAA,IAAI,CAAC,iBAAA,EAAmB;AAEpB,IAAA,MAAM,IAAA,GAAO,EAAA,GAAK,EAAA,GAAK,iBAAA,GAAoB,CAAA,GAAI,MAAA;AAC/C,IAAA,MAAM,IAAA,GAAO,UAAA;AAEb,IAAA,GAAA,CAAI,SAAA,GAAY,UAAU,KAAK,CAAA;AAC/B,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,IAAI,IAAA,EAAM,IAAA,EAAM,QAAQ,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AAC1C,IAAA,GAAA,CAAI,IAAA,EAAK;AAET,IAAA,GAAA,CAAI,cAAc,KAAA,CAAM,UAAA;AACxB,IAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,IAAA,GAAA,CAAI,OAAA,GAAU,OAAA;AACd,IAAA,MAAM,GAAA,GAAM,GAAA;AACZ,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,IAAA,GAAO,GAAA,EAAK,IAAA,GAAO,GAAG,CAAA;AACjC,IAAA,GAAA,CAAI,MAAA,CAAO,IAAA,GAAO,GAAA,EAAK,IAAA,GAAO,GAAG,CAAA;AACjC,IAAA,GAAA,CAAI,MAAA,CAAO,IAAA,GAAO,GAAA,EAAK,IAAA,GAAO,GAAG,CAAA;AACjC,IAAA,GAAA,CAAI,MAAA,CAAO,IAAA,GAAO,GAAA,EAAK,IAAA,GAAO,GAAG,CAAA;AACjC,IAAA,GAAA,CAAI,MAAA,EAAO;AAEX,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACV,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,WAAA;AAAA,MACA,iBAAA;AAAA,MACA,GAAG,IAAA,GAAO,MAAA;AAAA,MACV,GAAG,IAAA,GAAO,MAAA;AAAA,MACV,GAAG,MAAA,GAAS,CAAA;AAAA,MACZ,GAAG,MAAA,GAAS;AAAA,KACf,CAAA;AAAA,EACL;AAEA,EAAA,GAAA,CAAI,OAAA,EAAQ;AAKZ,EAAA,SAAA,CAAU,IAAA,CAAK;AAAA,IACX,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,WAAA;AAAA,IACA,KAAA;AAAA,IACA,aAAa,KAAA,CAAM,KAAA;AAAA,IACnB,UAAA,EAAa,MAA4B,IAAA,IAAQ,KAAA;AAAA,IACjD,iBAAA;AAAA,IACA,CAAA,EAAG,YAAA;AAAA,IACH,GAAG,CAAA,GAAI,CAAA;AAAA,IACP,GAAG,MAAA,GAAS,YAAA;AAAA,IACZ,CAAA,EAAG,EAAA;AAAA,IACH,SAAA,EAAW;AAAA,GACd,CAAA;AAGD,EAAA,MAAM,aAAA,GAAgB,MAAA,GAAS,CAAA,GAAI,iBAAA,GAAoB,CAAA;AACvD,EAAA,SAAA,CAAU,IAAA,CAAK;AAAA,IACX,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,WAAA;AAAA,IACA,KAAA;AAAA,IACA,aAAa,KAAA,CAAM,KAAA;AAAA,IACnB,UAAA,EAAa,MAA4B,IAAA,IAAQ,KAAA;AAAA,IACjD,iBAAA;AAAA,IACA,CAAA,EAAG,EAAA;AAAA,IACH,CAAA,EAAG,EAAA;AAAA,IACH,GAAG,EAAA,GAAK,aAAA;AAAA,IACR,CAAA,EAAG,EAAA;AAAA,IACH,SAAA,EAAW;AAAA,GACd,CAAA;AACL;AAQA,SAAS,iBAAA,CACL,GAAA,EACA,OAAA,EACA,WAAA,EACA,OACA,KAAA,EACI;AACJ,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,WAAA,GAAc,KAAK,IAAI,CAAA,EAAG;AACvC,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,WAAA,GAAc,UAAU,KAAK,CAAA;AACjC,EAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAClB,EAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,EAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,MAAA,CAAO,SAAS,WAAW,CAAA;AAC/B,EAAA,GAAA,CAAI,MAAA,CAAO,SAAS,KAAK,CAAA;AACzB,EAAA,GAAA,CAAI,MAAA,EAAO;AACX,EAAA,GAAA,CAAI,OAAA,EAAQ;AAChB;AAEA,SAAS,eACL,GAAA,EACA,CAAA,EACA,IAAA,EACA,IAAA,EACA,QACA,OAAA,EACI;AACJ,EAAA,MAAM,QAAA,GAAW,OAAA,GAAU,MAAA,CAAO,eAAA,GAAkB,MAAA,CAAO,UAAA;AAC3D,EAAA,MAAM,IAAA,GAAO,CAAA;AACb,EAAA,MAAM,IAAA,GAAO,CAAA;AACb,EAAA,MAAM,MAAA,GAAS,IAAA,IAAQ,UAAA,GAAa,CAAA,CAAA,GAAA,CAAM,OAAO,CAAA,IAAK,CAAA;AACtD,EAAA,MAAM,MAAA,GAAS,IAAA,IAAQ,UAAA,GAAa,CAAA,CAAA,GAAA,CAAM,OAAO,CAAA,IAAK,CAAA;AACtD,EAAA,MAAM,MAAA,GAAS,CAAA,GAAA,CAAK,MAAA,GAAS,MAAA,IAAU,CAAA,GAAI,UAAA;AAC3C,EAAA,MAAM,MAAA,GAAS,IAAA,GAAA,CAAQ,IAAA,GAAO,MAAA,IAAU,CAAA,GAAI,UAAA;AAE5C,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,SAAA,GAAY,QAAA;AAChB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC3B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,EAAM,CAAA,EAAA,EAAK;AAC3B,MAAA,MAAM,EAAA,GAAK,MAAA,GAAS,CAAA,IAAK,UAAA,GAAa,CAAA,GAAI,CAAA,CAAA;AAC1C,MAAA,MAAM,EAAA,GAAK,MAAA,GAAS,CAAA,IAAK,UAAA,GAAa,CAAA,GAAI,CAAA,CAAA;AAC1C,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,YAAY,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AAC1C,MAAA,GAAA,CAAI,IAAA,EAAK;AAAA,IACb;AAAA,EACJ;AACA,EAAA,GAAA,CAAI,OAAA,EAAQ;AAChB;AAGA,SAAS,UACL,GAAA,EACA,CAAA,EACA,CAAA,EACA,CAAA,EACA,GACA,CAAA,EACI;AACJ,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AACnB,EAAA,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AACvB,EAAA,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,GAAI,GAAG,CAAC,CAAA;AACnC,EAAA,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAI,CAAC,CAAA;AAC3B,EAAA,GAAA,CAAI,KAAA,CAAM,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AACvB,EAAA,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,GAAI,CAAA,EAAG,GAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAC,CAAA;AACnC,EAAA,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AACnB,EAAA,GAAA,CAAI,MAAM,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,GAAG,CAAC,CAAA;AAC3B,EAAA,GAAA,CAAI,SAAA,EAAU;AAClB;AAMO,SAAS,sBAAA,CACZ,CAAA,EACA,CAAA,EACA,QAAA,EACwB;AACxB,EAAA,OAAO,QAAA,CAAS,KAAK,CAAC,CAAA,KAAM,KAAK,CAAA,CAAE,CAAA,IAAK,KAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,IAAK,CAAA,IAAK,EAAE,CAAA,IAAK,CAAA,IAAK,EAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA;AAC7F;AAMO,SAAS,qBAAA,CACZ,CAAA,EACA,CAAA,EACA,SAAA,EACwB;AACxB,EAAA,OAAO,SAAA,CAAU,KAAK,CAAC,CAAA,KAAM,KAAK,CAAA,CAAE,CAAA,IAAK,KAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,IAAK,CAAA,IAAK,EAAE,CAAA,IAAK,CAAA,IAAK,EAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA;AAC9F;AAKO,SAAS,wBAAA,CACZ,CAAA,EACA,CAAA,EACA,YAAA,EAC4B;AAC5B,EAAA,OACI,YAAA,CAAa,KAAK,CAAC,CAAA,KAAM,KAAK,CAAA,CAAE,CAAA,IAAK,KAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,IAAK,CAAA,IAAK,EAAE,CAAA,IAAK,CAAA,IAAK,EAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA;AAE9F;AAMO,SAAS,sBAAA,CACZ,CAAA,EACA,CAAA,EACA,UAAA,EACqB;AACrB,EAAA,OACI,UAAA,CAAW,IAAA;AAAA,IACP,CAAC,CAAA,KACI,CAAA,IAAK,CAAA,CAAE,QAAQ,CAAA,IAAK,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,IAAA,IAAQ,CAAA,IAAK,CAAA,CAAE,IAAA,IAAQ,KAAK,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,IAAA,IACtE,CAAA,IAAK,CAAA,CAAE,KAAA,IAAS,CAAA,IAAK,EAAE,KAAA,GAAQ,CAAA,CAAE,KAAA,IAAS,CAAA,IAAK,CAAA,CAAE,KAAA,IAAS,CAAA,IAAK,CAAA,CAAE,QAAQ,CAAA,CAAE;AAAA,GACpF,IAAK,IAAA;AAEb;AAMO,SAAS,qBAAA,CACZ,CAAA,EACA,CAAA,EACA,SAAA,EACkB;AAClB,EAAA,OAAO,SAAA,CAAU,KAAK,CAAC,CAAA,KAAM,KAAK,CAAA,CAAE,CAAA,IAAK,KAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,IAAK,CAAA,IAAK,EAAE,CAAA,IAAK,CAAA,IAAK,EAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA;AAC9F;AAMO,SAAS,2BAAA,CACZ,CAAA,EACA,CAAA,EACA,KAAA,EAC0B;AAC1B,EAAA,OAAO,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,KAAK,CAAA,CAAE,CAAA,IAAK,KAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,IAAK,CAAA,IAAK,EAAE,CAAA,IAAK,CAAA,IAAK,EAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA;AAC1F;AAOO,SAAS,sBAAA,CACZ,KACA,MAAA,EACA,KAAA,EACA,YACA,KAAA,EACA,MAAA,EACA,QACA,SAAA,EACI;AACJ,EAAA,MAAM,IAAA,GAAO,EAAA;AAEb,EAAA,MAAM,QAA4D,EAAC;AACnE,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AACxB,IAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC/B,IAAA,MAAM,GAAA,GAAM,KAAA;AACZ,IAAA,IAAI,IAAI,kBAAA,EAAoB;AAC5B,IAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,IAAI,CAAA,GAAI,CAAC,IAAA,IAAQ,CAAA,GAAI,SAAS,IAAA,EAAM;AACpC,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACP,CAAA;AAAA,MACA,KAAA,EAAO,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA;AAAA,MAClC,KAAA,EAAO,UAAA,CAAW,KAAA,EAAO,KAAA,CAAM,aAAa,KAAK;AAAA,KACpD,CAAA;AAAA,EACL;AACA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAExB,EAAA,KAAA,CAAM,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA;AAG9B,EAAA,IAAI,UAAA,GAAa,CAAA,QAAA;AACjB,EAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACpB,IAAA,IAAI,EAAA,CAAG,CAAA,GAAI,IAAA,GAAO,CAAA,GAAI,UAAA,EAAY;AAC9B,MAAA,EAAA,CAAG,CAAA,GAAI,aAAa,IAAA,GAAO,CAAA;AAAA,IAC/B;AACA,IAAA,UAAA,GAAa,EAAA,CAAG,CAAA,GAAI,IAAA,GAAO,CAAA,GAAI,CAAA;AAAA,EACnC;AAEA,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,EAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAChB,EAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AACnB,EAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACpB,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,WAAA,CAAY,EAAA,CAAG,KAAK,CAAA,CAAE,KAAA;AACrC,IAAA,GAAA,CAAI,YAAY,EAAA,CAAG,KAAA;AACnB,IAAA,GAAA,CAAI,QAAA,CAAS,QAAQ,EAAA,CAAG,CAAA,GAAI,OAAO,CAAA,EAAG,EAAA,GAAK,IAAI,IAAI,CAAA;AACnD,IAAA,GAAA,CAAI,SAAA,GAAY,SAAA;AAChB,IAAA,GAAA,CAAI,SAAS,EAAA,CAAG,KAAA,EAAO,MAAA,GAAS,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,EAC3C;AACA,EAAA,GAAA,CAAI,OAAA,EAAQ;AAChB;;;ACt/DO,SAAS,yBAAA,CACZ,MAAA,EACA,UAAA,EACA,aAAA,EACoC;AACpC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,UAAA;AAErB,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AACxB,IAAA,IAAI,KAAA,CAAM,UAAU,aAAA,EAAe;AAEnC,IAAA,MAAM,aAAA,GACF,MAAM,IAAA,KAAS,SAAA,IACd,MAA4B,SAAA,KAAc,QAAA,IAC1C,KAAA,CAAM,IAAA,EAA6C,QAAA,KAAa,IAAA;AACrE,IAAA,IAAI,aAAA,EAAe;AAEnB,IAAA,IAAI,QAAA,CAAS,KAAA,CAAM,KAAK,CAAA,EAAG;AACvB,MAAA,IAAI,KAAA,CAAM,KAAA,GAAQ,GAAA,EAAK,KAAA,CAAM,KAAK,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,IAAA,EAAM,SAAS,CAAA;AAAA,WAAA,IAClF,KAAA,CAAM,KAAA,GAAQ,GAAA,EAAK,KAAA,CAAM,KAAK,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,IAAA,EAAM,SAAS,CAAA;AAAA,IACpG;AAEA,IAAA,MAAM,UAAW,KAAA,CAAwB,aAAA;AACzC,IAAA,MAAM,UAAW,KAAA,CAAwB,eAAA;AAEzC,IAAA,IAAI,OAAA,KAAY,MAAA,IAAa,QAAA,CAAS,OAAO,CAAA,EAAG;AAC5C,MAAA,IAAI,OAAA,GAAU,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,WAAA,IACvE,OAAA,GAAU,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,IACzF;AACA,IAAA,IAAI,OAAA,KAAY,MAAA,IAAa,QAAA,CAAS,OAAO,CAAA,EAAG;AAC5C,MAAA,IAAI,OAAA,GAAU,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,WAAA,IACvE,OAAA,GAAU,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,IACzF;AAAA,EACJ;AAEA,EAAA,OAAO,EAAE,OAAO,KAAA,EAAM;AAC1B;AAGA,SAAS,WAAW,OAAA,EAA2B;AAC3C,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,MAAW,CAAA,IAAK,OAAA,EAAS,IAAI,CAAA,CAAE,SAAS,OAAA,EAAS,CAAA,EAAA;AACjD,EAAA,OAAO,CAAA;AACX;AAGA,SAAS,iBAAA,CAAkB,SAAmB,IAAA,EAAsB;AAChE,EAAA,IAAI,IAAA,GAAO,QAAQ,CAAC,CAAA;AACpB,EAAA,IAAI,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,QAAQ,IAAI,CAAA;AACzC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAC,CAAA,CAAG,QAAQ,IAAI,CAAA;AAC3C,IAAA,IAAI,IAAI,QAAA,EAAU;AACd,MAAA,IAAA,GAAO,QAAQ,CAAC,CAAA;AAChB,MAAA,QAAA,GAAW,CAAA;AAAA,IACf;AAAA,EACJ;AACA,EAAA,OAAO,IAAA;AACX;AAEA,IAAM,SAAA,GAAY,qCAAA;AAClB,IAAMC,WAAAA,GAAa,CAAA;AACnB,IAAM,iBAAA,GAAoB,CAAA;AAC1B,IAAM,aAAA,GAAgB,EAAA;AACtB,IAAM,MAAA,GAAS,EAAA;AACf,IAAM,WAAA,GAAc,EAAA;AACpB,IAAM,QAAA,GAAW,QAAA;AACjB,IAAM,UAAA,GAAa,QAAA;AAMZ,SAAS,2BAAA,CACZ,KACA,MAAA,EACA,UAAA,EACA,OACA,UAAA,EACA,WAAA,EACA,aAAA,EACA,aAAA,GAA+B,IAAA,EACG;AAClC,EAAA,MAAM,WAAiC,EAAC;AAMxC,EAAA,MAAM,UAAA,GAAa,EAAA;AACnB,EAAA,MAAM,MAAA,GAAS,cAAc,CAAA,GAAI,UAAA;AACjC,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,GAAA,GAAM,UAAA,CAAW,GAAA;AACzC,EAAA,MAAM,UAAA,GAAa,MAAA,GAAS,CAAA,GAAK,IAAA,GAAO,SAAU,UAAA,GAAa,CAAA;AAC/D,EAAA,MAAM,WAAA,GAA0B;AAAA,IAC5B,GAAA,EAAK,WAAW,GAAA,GAAM,UAAA;AAAA,IACtB,GAAA,EAAK,WAAW,GAAA,GAAM;AAAA,GAC1B;AAEA,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,KAAU,yBAAA,CAA0B,MAAA,EAAQ,aAAa,aAAa,CAAA;AACrF,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,IAAK,KAAA,CAAM,WAAW,CAAA,EAAG,OAAO,EAAE,QAAA,EAAS;AAEhE,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,IAAA,GAAO,SAAA;AACX,EAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AACnB,EAAA,GAAA,CAAI,SAAA,GAAY,QAAA;AAEhB,EAAA,MAAMC,SAAAA,GAAW,CAAA;AAGjB,EAAA,MAAM,UAAA,GAAa,CACf,SAAA,EACA,IAAA,EACA,GACA,MAAA,KACS;AACT,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,WAAA,CAAY,IAAI,CAAA,CAAE,KAAA;AACpC,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,KAAK,IAAID,WAAAA,GAAa,CAAA;AAC1C,IAAA,MAAM,CAAA,GAAI,aAAa,iBAAA,GAAoB,CAAA;AAE3C,IAAA,GAAA,CAAI,SAAA,GAAY,MAAM,OAAA,CAAQ,UAAA;AAC9B,IAAA,GAAA,CAAI,WAAA,GAAc,MAAM,OAAA,CAAQ,MAAA;AAChC,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,WAAA,CAAY,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,QAAQ,WAAW,CAAA;AAC7C,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,MAAA,EAAO;AAEX,IAAA,GAAA,CAAI,SAAA,GAAY,MAAM,OAAA,CAAQ,IAAA;AAC9B,IAAA,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,GAAI,MAAA,GAAS,IAAI,GAAG,CAAA;AAElD,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACV,SAAA;AAAA,MACA,CAAA;AAAA,MACA,CAAA;AAAA,MACA,CAAA;AAAA,MACA,CAAA,EAAG,MAAA;AAAA,MACH,aAAa,MAAA,CAAO,KAAA;AAAA,MACpB,aAAa,MAAA,CAAO,KAAA;AAAA,MACpB,YAAY,MAAA,CAAO;AAAA,KACtB,CAAA;AACD,IAAA,OAAO,CAAA;AAAA,EACX,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,SAAA,EAAiC,OAAA,EAAmB,KAAA,KAAwB;AAC5F,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC1B,IAAA,MAAM,KAAA,GAAQ,SAAA,KAAc,IAAA,GAAO,QAAA,GAAW,UAAA;AAC9C,IAAA,MAAM,IAAA,GAAO,SAAA,KAAc,IAAA,GAAO,UAAA,CAAW,MAAM,UAAA,CAAW,GAAA;AAE9D,IAAA,MAAM,QAAA,GAAW,SAAA,KAAc,IAAA,GAAO,CAAA,GAAI,EAAA;AAC1C,IAAA,IAAI,KAAA,GAAQ,KAAA;AAGZ,IAAA,MAAM,OAAA,GAAU,WAAW,OAAO,CAAA;AAClC,IAAA,IAAI,UAAU,CAAA,EAAG;AACb,MAAA,MAAM,MAAA,GAAS,iBAAA;AAAA,QACX,QAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,OAAO,CAAA;AAAA,QACxC;AAAA,OACJ;AACA,MAAA,UAAA,CAAW,WAAW,CAAA,EAAG,KAAK,IAAI,OAAO,CAAA,CAAA,EAAI,OAAO,MAAM,CAAA;AAC1D,MAAA,KAAA,IAAS,YAAY,MAAA,GAASC,SAAAA,CAAAA;AAAA,IAClC;AAGA,IAAA,IAAI,kBAAkB,IAAA,EAAM;AACxB,MAAA,MAAM,iBAAiB,OAAA,CAAQ,MAAA;AAAA,QAC3B,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,OAAA,IAAW,EAAE,KAAA,KAAU;AAAA,OAC7C;AACA,MAAA,KAAA,MAAW,MAAM,cAAA,EAAgB;AAC7B,QAAA,MAAM,SAAA,GAAY,EAAA,CAAG,IAAA,CAAK,WAAA,EAAY;AACtC,QAAA,UAAA,CAAW,WAAW,CAAA,EAAG,KAAK,IAAI,SAAS,CAAA,CAAA,EAAI,OAAO,EAAE,CAAA;AACxD,QAAA,KAAA,IAAS,YAAY,MAAA,GAASA,SAAAA,CAAAA;AAAA,MAClC;AAAA,IACJ;AAAA,EACJ,CAAA;AAEA,EAAA,UAAA,CAAW,IAAA,EAAM,OAAO,aAAa,CAAA;AACrC,EAAA,UAAA,CAAW,MAAA,EAAQ,KAAA,EAAO,WAAA,GAAc,aAAA,GAAgB,MAAM,CAAA;AAE9D,EAAA,GAAA,CAAI,OAAA,EAAQ;AACZ,EAAA,OAAO,EAAE,QAAA,EAAS;AACtB;AAGO,SAAS,2BAAA,CACZ,CAAA,EACA,CAAA,EACA,QAAA,EACyB;AACzB,EAAA,OAAO,QAAA,CAAS,KAAK,CAAC,CAAA,KAAM,KAAK,CAAA,CAAE,CAAA,IAAK,KAAK,CAAA,CAAE,CAAA,GAAI,EAAE,CAAA,IAAK,CAAA,IAAK,EAAE,CAAA,IAAK,CAAA,IAAK,EAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA;AAC7F;AAOO,SAAS,uBAAA,CACZ,OAAA,EACA,KAAA,EACA,QAAA,EACO;AACP,EAAA,MAAM,MAAM,OAAA,GAAU,KAAA;AACtB,EAAA,MAAM,SAAS,OAAA,GAAU,KAAA;AACzB,EAAA,OAAO,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,MAAA,GAAS,CAAA,CAAE,CAAC,CAAA;AAC/D;AAEA,SAAS,YACL,GAAA,EACA,CAAA,EACA,CAAA,EACA,CAAA,EACA,GACA,CAAA,EACI;AACJ,EAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AACnC,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,EAAA,EAAI,CAAC,CAAA;AACpB,EAAA,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,CAAA,GAAI,EAAA,EAAI,CAAC,CAAA;AACxB,EAAA,GAAA,CAAI,iBAAiB,CAAA,GAAI,CAAA,EAAG,GAAG,CAAA,GAAI,CAAA,EAAG,IAAI,EAAE,CAAA;AAC5C,EAAA,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAI,EAAE,CAAA;AAC5B,EAAA,GAAA,CAAI,gBAAA,CAAiB,IAAI,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,CAAC,CAAA;AACpD,EAAA,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,CAAC,CAAA;AACxB,EAAA,GAAA,CAAI,iBAAiB,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAG,CAAA,GAAI,IAAI,EAAE,CAAA;AAC5C,EAAA,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAA,GAAI,EAAE,CAAA;AACpB,EAAA,GAAA,CAAI,gBAAA,CAAiB,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,IAAI,CAAC,CAAA;AACpC,EAAA,GAAA,CAAI,SAAA,EAAU;AAClB;;;AC9PA,IAAM,sBAAA,GAAyB,EAAA;AAC/B,IAAM,yBAAA,GAA4B,CAAA;AAClC,IAAM,sBAAA,GAAyB,CAAA;AAE/B,IAAM,sBAAgC,CAAC,IAAA,EAAM,MAAM,KAAA,EAAO,KAAA,EAAO,MAAM,IAAI,CAAA;AAEpE,SAAS,gBAAgB,QAAA,EAA0B;AACtD,EAAA,IAAI,QAAA,GAAW,EAAA,EAAI,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,CAAA;AACrC,EAAA,IAAI,WAAW,IAAA,EAAO;AAClB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,EAAE,CAAA;AAClC,IAAA,MAAM,IAAI,QAAA,GAAW,EAAA;AACrB,IAAA,OAAO,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,UAAS,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA;AAAA,EAChD;AACA,EAAA,IAAI,WAAW,KAAA,EAAQ;AACnB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,IAAK,CAAA;AACrC,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAO,QAAA,GAAW,OAAS,EAAE,CAAA;AAC5C,IAAA,OAAO,CAAA,EAAG,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,CAAA;AAAA,EACrB;AACA,EAAA,IAAI,WAAW,MAAA,EAAS;AACpB,IAAA,MAAMC,EAAAA,GAAI,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,KAAM,CAAA;AACtC,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAO,QAAA,GAAW,QAAU,IAAK,CAAA;AAChD,IAAA,OAAO,CAAA,EAAGA,EAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,CAAA;AAAA,EACrB;AACA,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,MAAO,CAAA;AACvC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAO,QAAA,GAAW,SAAW,KAAM,CAAA;AAClD,EAAA,OAAO,CAAA,EAAG,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA,CAAA;AACrB;AAEA,SAAS,gBAAgB,EAAA,EAAY,WAAA,EAAqB,SAAA,EAAoB,iBAAA,EAA6B,WAAW,KAAA,EAAe;AACjI,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,EAAE,CAAA;AACrB,EAAA,IAAI,SAAA,IAAa,mBAAA,CAAoB,QAAA,CAAS,SAAS,CAAA,EAAG;AACtD,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,kBAAA,CAAmB,OAAA,EAAS;AAAA,MACvC,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ,SAAA;AAAA,MACR,MAAA,EAAQ,KAAA;AAAA,MACR,QAAA,EAAU;AAAA,KACb,CAAA;AACD,IAAA,IAAI,iBAAA,EAAmB;AACnB,MAAA,OAAO,CAAA,CAAE,kBAAA,CAAmB,OAAA,EAAS,EAAE,KAAA,EAAO,OAAA,EAAS,GAAA,EAAK,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,CAAA,GAAI,GAAA,GAAM,IAAA;AAAA,IACzG;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACA,EAAA,IAAI,cAAc,IAAA,EAAM;AACpB,IAAA,OAAO,CAAA,CAAE,mBAAmB,OAAA,EAAS,EAAE,MAAM,SAAA,EAAW,QAAA,EAAU,UAAU,CAAA;AAAA,EAChF;AACA,EAAA,IAAI,cAAc,IAAA,EAAM;AACpB,IAAA,OAAO,CAAA,CAAE,kBAAA,CAAmB,OAAA,EAAS,EAAE,KAAA,EAAO,SAAS,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,CAAA;AAAA,EAChG;AACA,EAAA,IAAI,eAAe,GAAA,EAAK;AACpB,IAAA,OAAO,CAAA,CAAE,mBAAmB,OAAA,EAAS;AAAA,MACjC,KAAA,EAAO,OAAA;AAAA,MACP,GAAA,EAAK,SAAA;AAAA,MACL,QAAA,EAAU;AAAA,KACb,CAAA;AAAA,EACL;AACA,EAAA,OAAO,CAAA,CAAE,kBAAA,CAAmB,OAAA,EAAS,EAAE,KAAA,EAAO,SAAS,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,CAAA;AAChG;AAEO,SAAS,cAAA,CACZ,GAAA,EACA,IAAA,EACA,QAAA,EACA,OACA,KAAA,EACA,UAAA,EACA,KAAA,EACA,SAAA,GAAY,GACZ,GAAA,GAAwB,wBAAA,EACxB,SAAA,EACA,iBAAA,EACA,WAAW,KAAA,EACP;AACJ,EAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AAEvB,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,QAAA,GAAW,QAAA,CAAS,UAAA;AAEjD,EAAA,MAAM,QAAA,GAAW,KAAK,CAAC,CAAA;AACvB,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AACpC,EAAA,MAAM,iBAAA,GACF,CAAC,CAAC,QAAA,IACF,CAAC,CAAC,OAAA,IACF,IAAI,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,CAAE,kBAAA,CAAmB,OAAA,EAAS,EAAE,QAAA,EAAU,QAAA,EAAU,CAAA,KAC1E,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,CAAE,kBAAA,CAAmB,OAAA,EAAS,EAAE,QAAA,EAAU,UAAU,CAAA;AAE7E,EAAA,GAAA,CAAI,YAAY,KAAA,CAAM,QAAA;AACtB,EAAA,GAAA,CAAI,OAAO,CAAA,EAAG,GAAA,CAAI,QAAQ,CAAA,CAAA,EAAI,IAAI,UAAU,CAAA,CAAA;AAC5C,EAAA,GAAA,CAAI,SAAA,GAAY,QAAA;AAKhB,EAAA,MAAM,OAAA,GAAU,EAAA;AAChB,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAS,CAAC,CAAC,CAAA,IAAK,IAAA,CAAK,CAAC,CAAA;AAC7D,EAAA,MAAM,cAAc,eAAA,CAAgB,SAAA,CAAU,MAAM,WAAA,EAAa,SAAA,EAAW,mBAAmB,QAAQ,CAAA;AACvG,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,WAAA,CAAY,WAAW,CAAA,CAAE,KAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,SAAS,CAAC,CAAA;AAC/D,EAAA,IAAI,IAAA,GAAO,OAAA;AACX,EAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACjB,IAAA,MAAM,WAAW,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,MAAM,CAAA;AACrD,IAAA,MAAM,UAAA,GAAa,SAAS,OAAA,GAAU,CAAA;AACtC,IAAA,IAAI,QAAA,GAAW,OAAO,UAAA,EAAY;AAC9B,MAAA,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,UAAA,GAAa,QAAQ,CAAA;AAAA,IAC1C;AAAA,EACJ;AAEA,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,KAAK,IAAA,EAAM;AACxC,IAAA,MAAM,QAAA,GAAW,SAAS,UAAA,GAAa,CAAA;AACvC,IAAA,IAAI,iBAAA,KAAsB,MAAA,IAAa,QAAA,KAAa,iBAAA,EAAmB;AACvE,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU,UAAU,UAAU,CAAA;AACvD,IAAA,MAAM,KAAA,GAAQ,gBAAgB,IAAA,CAAK,CAAC,EAAE,IAAA,EAAM,WAAA,EAAa,SAAA,EAAW,iBAAA,EAAmB,QAAQ,CAAA;AAE/F,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,WAAA,CAAY,KAAK,EAAE,KAAA,GAAQ,CAAA;AAC7C,IAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,KAAA,EAAO,KAAK,GAAA,CAAI,UAAA,GAAa,KAAA,EAAO,CAAC,CAAC,CAAA;AAChE,IAAA,GAAA,CAAI,QAAA,CAAS,KAAA,EAAO,QAAA,EAAU,KAAA,GAAQ,EAAE,CAAA;AAAA,EAC5C;AACJ;AAMO,SAAS,qBAAA,CACZ,GAAA,EACA,WAAA,EACA,UAAA,EACA,YAAA,EACA,QAAA,EACA,KAAA,EACA,KAAA,EACA,UAAA,EACA,KAAA,EACA,GAAA,GAAwB,wBAAA,EACpB;AACJ,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAG,cAAc,UAAA,GAAa,IAAA,CAAK,KAAK,CAAA;AACnE,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,SAAA,GAAY,GAAI,CAAA;AAC3C,EAAA,MAAM,KAAA,GAAQ,gBAAgB,QAAQ,CAAA;AAEtC,EAAA,GAAA,CAAI,OAAO,CAAA,EAAG,GAAA,CAAI,QAAQ,CAAA,CAAA,EAAI,IAAI,UAAU,CAAA,CAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,WAAA,CAAY,KAAK,CAAA,CAAE,KAAA;AACrC,EAAA,MAAM,IAAA,GAAO,QAAQ,yBAAA,GAA4B,CAAA;AACjD,EAAA,MAAM,IAAA,GAAO,sBAAA;AAEb,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,YAAA,EAAc,UAAU,UAAU,CAAA;AAG3D,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,GAAG,CAAC,CAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,GAAO,CAAA;AACzB,EAAA,MAAM,OAAO,KAAA,GAAQ,CAAA;AAErB,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,KAAA,EAAO,UAAA,EAAY,yBAAyB,CAAC,CAAA;AACzD,EAAA,GAAA,CAAI,IAAA,EAAK;AAIT,EAAA,GAAA,CAAI,YAAY,KAAA,CAAM,QAAA;AACtB,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAM,sBAAsB,CAAA;AAC5D,EAAA,GAAA,CAAI,IAAA,EAAK;AAGT,EAAA,GAAA,CAAI,YAAY,KAAA,CAAM,UAAA;AACtB,EAAA,GAAA,CAAI,SAAA,GAAY,QAAA;AAChB,EAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AACnB,EAAA,GAAA,CAAI,QAAA,CAAS,KAAA,EAAO,EAAA,EAAI,IAAA,GAAO,OAAO,CAAC,CAAA;AACvC,EAAA,GAAA,CAAI,YAAA,GAAe,YAAA;AAEnB,EAAA,GAAA,CAAI,OAAA,EAAQ;AAChB;AAQO,SAAS,wBAAA,CACZ,KACA,WAAA,EACA,UAAA,EACA,OAEA,IAAA,EAEA,SAAA,EACA,MAEA,IAAA,EACI;AACJ,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAG,cAAc,UAAA,GAAa,IAAA,CAAK,KAAK,CAAA;AACnE,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,SAAA,GAAY,GAAI,CAAA;AAC3C,EAAA,MAAM,KAAA,GAAQ,gBAAgB,QAAQ,CAAA;AAEtC,EAAA,MAAM,OAAO,SAAA,GAAY,IAAA;AAEzB,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,YAAY,KAAA,CAAM,QAAA;AACtB,EAAA,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA;AAEnC,EAAA,GAAA,CAAI,YAAY,KAAA,CAAM,UAAA;AACtB,EAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,EAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAChB,EAAA,GAAA,CAAI,SAAS,KAAA,EAAO,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,OAAO,CAAC,CAAA;AAC7C,EAAA,GAAA,CAAI,OAAA,EAAQ;AAChB;;;AC7MO,SAAS,eAAA,CACd,GAAA,EACA,UAAA,EACA,KAAA,EACA,KAAA,EACA,UAAA,EACA,WAAA,EACA,SAAA,EACA,SAAA,EACA,cAAA,GAAiB,CAAA,EACjB,GAAA,GAAyB,yBAAA,EACnB;AACN,EAAA,GAAA,CAAI,YAAY,KAAA,CAAM,QAAA;AACtB,EAAA,GAAA,CAAI,OAAO,CAAA,EAAG,GAAA,CAAI,QAAQ,CAAA,CAAA,EAAI,IAAI,UAAU,CAAA,CAAA;AAC5C,EAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAKhB,EAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,IAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,UAAA,EAAY,WAAW,CAAA;AACxD,IAAA,MAAMC,KAAAA,GAAO,KAAA,CAAM,MAAA,IAAU,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,GAAK,UAAA,CAAW,GAAA,GAAM,UAAA,CAAW,GAAA;AACpF,IAAA,MAAM,SAAA,GAAY,gBAAA,CAAiBA,KAAAA,EAAM,cAAc,CAAA;AACvD,IAAA,KAAA,MAAW,SAAS,KAAA,EAAO;AACzB,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,KAAA,EAAO,YAAY,WAAW,CAAA;AACvD,MAAA,GAAA,CAAI,QAAA,CAAS,MAAM,OAAA,CAAQ,SAAS,GAAG,UAAA,GAAa,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,IAC9D;AACA,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAA,CAAQ,UAAA,CAAW,GAAA,GAAM,UAAA,CAAW,GAAA,IAAO,SAAA;AACjD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,SAAA,EAAW,CAAA,EAAA,EAAK;AACnC,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,GAAA,GAAM,IAAA,GAAO,CAAA;AACtC,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,KAAA,EAAO,YAAY,WAAW,CAAA;AACvD,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,cAAc,CAAA;AAC1C,IAAA,GAAA,CAAI,QAAA,CAAS,KAAA,EAAO,UAAA,GAAa,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,EAC3C;AACF;;;ACvBA,SAAS,KAAA,CAAM,MAAc,IAAA,EAAsB;AAC/C,EAAA,OAAO,CAAA,gCAAA,EAAmC,IAAI,CAAA,UAAA,EAAa,IAAI,oDAAoD,IAAI,CAAA,MAAA,CAAA;AAC3H;AAKO,IAAM,aAAA,GACT,CAAA,2gBAAA,CAAA;AAMG,IAAM,SAAA,GAAY,aAAA;AAGlB,IAAM,WAAA,GACT,CAAA,sRAAA,CAAA;AAKG,IAAM,UAAA,GACT,CAAA,qMAAA,CAAA;AAKG,IAAM,qBAAA,GACT,CAAA,qWAAA,CAAA;AAMG,IAAM,oBAAA,GACT,CAAA,uWAAA,CAAA;AAMG,IAAM,UAAA,GACT,CAAA,mdAAA,CAAA;AAOG,IAAM,WAAA,GAA0C;AAAA,EACnD,WAAA,EAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,EAYb,MAAA,EAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,EAYR,IAAA,EAAM,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,EAYN,IAAA,EAAM,CAAA;AAAA;AAAA,UAAA,CAAA;AAAA,EAIN,IAAA,EAAM,CAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,EAKN,UAAA,EAAY,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,EAYZ,aAAA,EAAe,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,EAYf,WAAA,EAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,EAUb,IAAA,EAAM,CAAA;AAAA;AAAA,UAAA,CAAA;AAAA,EAIN,OAAA,EAAS,CAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,EAKT,QAAA,EAAU,CAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,EAMV,OAAA,EAAS,CAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAAA,EAMT,OAAA,EAAS,CAAA;AAAA;AAAA;AAAA;AAAA,UAAA;AAKb,CAAA;AAKO,IAAM,QAAA,GAAmC;AAAA,EAC5C,WAAA,EAAa,KAAA;AAAA,IACT,CAAA;AAAA,mIAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA,EACA,cAAA,EAAgB,KAAA;AAAA,IACZ,CAAA;AAAA;AAAA;AAAA,6HAAA,CAAA;AAAA,IAIA;AAAA,GACJ;AAAA,EACA,gBAAA,EAAkB,KAAA;AAAA,IACd,CAAA,6FAAA,CAAA;AAAA,IACA;AAAA,GACJ;AAAA,EACA,iBAAA,EAAmB,KAAA;AAAA,IACf,CAAA;AAAA;AAAA,qIAAA,CAAA;AAAA,IAGA;AAAA,GACJ;AAAA,EACA,eAAA,EAAiB,KAAA;AAAA,IACb,CAAA;AAAA;AAAA;AAAA,6GAAA,CAAA;AAAA,IAIA;AAAA,GACJ;AAAA,EACA,iBAAA,EAAmB,KAAA;AAAA,IACf,CAAA;AAAA;AAAA,8FAAA,CAAA;AAAA,IAGA;AAAA,GACJ;AAAA,EACA,gBAAA,EAAkB,KAAA;AAAA,IACd,CAAA,mMAAA,CAAA;AAAA,IACA;AAAA,GACJ;AAAA,EACA,mBAAA,EAAqB,KAAA;AAAA,IACjB,CAAA;AAAA,2HAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA,EACA,YAAA,EAAc,KAAA;AAAA,IACV,CAAA,0IAAA,CAAA;AAAA,IACA;AAAA,GACJ;AAAA,EACA,iBAAA,EAAmB,KAAA;AAAA,IACf,CAAA;AAAA,iIAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA,EACA,cAAA,EAAgB,KAAA;AAAA,IACZ,CAAA;AAAA,sFAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA,EACA,iBAAA,EAAmB,KAAA;AAAA,IACf,CAAA;AAAA;AAAA,0IAAA,CAAA;AAAA,IAGA;AAAA;AAER,CAAA;AAKO,IAAM,WAAA,GAAsC;AAAA,EAC/C,IAAA,EAAM,KAAA;AAAA,IACF,CAAA;AAAA,iIAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA,EACA,IAAA,EAAM,KAAA;AAAA,IACF,CAAA;AAAA,mIAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA,EACA,eAAA,EAAiB,KAAA;AAAA,IACb,CAAA;AAAA,8GAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA,EACA,SAAA,EAAW,KAAA;AAAA,IACP,CAAA;AAAA;AAAA,uIAAA,CAAA;AAAA,IAGA;AAAA,GACJ;AAAA,EACA,iBAAA,EAAmB,KAAA;AAAA,IACf,CAAA;AAAA,+EAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA,EACA,WAAA,EAAa,KAAA;AAAA,IACT,CAAA;AAAA,mHAAA,CAAA;AAAA,IAEA;AAAA;AAER,CAAA;AAGO,IAAM,mBAAA,GAAuD;AAAA,EAChE,iBAAA,EAAmB,KAAA;AAAA,IACf,CAAA;AAAA,8GAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA,EACA,WAAA,EAAa,KAAA;AAAA,IACT,CAAA;AAAA,qHAAA,CAAA;AAAA,IAEA;AAAA;AAER,CAAA;AAKO,IAAM,QAAA,GAAmB,YAAY,mBAAmB,CAAA;AAGxD,IAAM,YAAA,GAAuB,oBAAoB,mBAAmB,CAAA;AAKpE,IAAM,SAAA,GAAoC;AAAA;AAAA,EAE7C,UAAA,EAAY,KAAA;AAAA,IACR,CAAA;AAAA,mIAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA,EACA,WAAA,EAAa,KAAA;AAAA,IACT,CAAA;AAAA;AAAA,8GAAA,CAAA;AAAA,IAGA;AAAA,GACJ;AAAA,EACA,eAAA,EAAiB,KAAA;AAAA,IACb,CAAA,oGAAA,CAAA;AAAA,IACA;AAAA,GACJ;AAAA,EACA,aAAA,EAAe,KAAA;AAAA,IACX,CAAA,oGAAA,CAAA;AAAA,IACA;AAAA,GACJ;AAAA,EACA,UAAA,EAAY,KAAA;AAAA,IACR,CAAA;AAAA,6GAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA,EACA,gBAAA,EAAkB,KAAA;AAAA,IACd,CAAA;AAAA,4HAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA,EACA,gBAAA,EAAkB,KAAA;AAAA,IACd,CAAA;AAAA,6HAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA,EACA,YAAA,EAAc,KAAA;AAAA,IACV,CAAA;AAAA,6HAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA;AAAA,EAEA,eAAA,EAAiB,KAAA;AAAA,IACb,CAAA;AAAA;AAAA;AAAA,2HAAA,CAAA;AAAA,IAIA;AAAA,GACJ;AAAA,EACA,aAAA,EAAe,KAAA;AAAA,IACX,CAAA;AAAA;AAAA;AAAA;AAAA,4HAAA,CAAA;AAAA,IAKA;AAAA,GACJ;AAAA,EACA,WAAA,EAAa,KAAA;AAAA,IACT,CAAA;AAAA;AAAA,0HAAA,CAAA;AAAA,IAGA;AAAA,GACJ;AAAA,EACA,YAAA,EAAc,KAAA;AAAA,IACV,CAAA;AAAA;AAAA,8HAAA,CAAA;AAAA,IAGA;AAAA,GACJ;AAAA,EACA,WAAA,EAAa,KAAA;AAAA,IACT,CAAA;AAAA,2FAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA,EACA,UAAA,EAAY,KAAA;AAAA,IACR,CAAA,0IAAA,CAAA;AAAA,IACA;AAAA,GACJ;AAAA,EACA,OAAA,EAAS,KAAA;AAAA,IACL,CAAA;AAAA;AAAA,2HAAA,CAAA;AAAA,IAGA;AAAA,GACJ;AAAA,EACA,QAAA,EAAU,KAAA;AAAA,IACN,CAAA;AAAA;AAAA,2HAAA,CAAA;AAAA,IAGA;AAAA,GACJ;AAAA,EACA,WAAA,EAAa,KAAA;AAAA,IACT,CAAA;AAAA;AAAA,mGAAA,CAAA;AAAA,IAGA;AAAA,GACJ;AAAA,EACA,QAAA,EAAU,KAAA;AAAA,IACN,CAAA;AAAA;AAAA,kGAAA,CAAA;AAAA,IAGA;AAAA,GACJ;AAAA;AAAA,EAEA,SAAA,EAAW,KAAA;AAAA,IACP,CAAA,+FAAA,CAAA;AAAA,IACA;AAAA,GACJ;AAAA,EACA,iBAAA,EAAmB,KAAA;AAAA,IACf,CAAA,qHAAA,CAAA;AAAA,IACA;AAAA,GACJ;AAAA,EACA,OAAA,EAAS,KAAA;AAAA,IACL,CAAA,+EAAA,CAAA;AAAA,IACA;AAAA,GACJ;AAAA,EACA,QAAA,EAAU,KAAA;AAAA,IACN,CAAA,mGAAA,CAAA;AAAA,IACA;AAAA,GACJ;AAAA,EACA,MAAA,EAAQ,KAAA,CAAM,CAAA,wEAAA,CAAA,EAA4E,EAAE,CAAA;AAAA,EAC5F,GAAA,EAAK,KAAA;AAAA,IACD,CAAA,8GAAA,CAAA;AAAA,IACA;AAAA,GACJ;AAAA,EACA,QAAA,EAAU,KAAA;AAAA,IACN,CAAA,oIAAA,CAAA;AAAA,IACA;AAAA,GACJ;AAAA,EACA,IAAA,EAAM,KAAA;AAAA,IACF,CAAA,4HAAA,CAAA;AAAA,IACA;AAAA,GACJ;AAAA;AAAA,EAEA,WAAA,EAAa,KAAA;AAAA,IACT,CAAA;AAAA;AAAA,qIAAA,CAAA;AAAA,IAGA;AAAA,GACJ;AAAA,EACA,UAAA,EAAY,KAAA;AAAA,IACR,CAAA;AAAA;AAAA,qIAAA,CAAA;AAAA,IAGA;AAAA,GACJ;AAAA,EACA,gBAAA,EAAkB,KAAA;AAAA,IACd,CAAA;AAAA,kIAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA,EACA,KAAA,EAAO,KAAA;AAAA,IACH,CAAA;AAAA;AAAA;AAAA;AAAA,8GAAA,CAAA;AAAA,IAKA;AAAA,GACJ;AAAA;AAAA,EAEA,SAAA,EAAW,KAAA;AAAA,IACP,CAAA;AAAA;AAAA;AAAA,6GAAA,CAAA;AAAA,IAIA;AAAA,GACJ;AAAA,EACA,gBAAA,EAAkB,KAAA;AAAA,IACd,CAAA;AAAA;AAAA;AAAA,6GAAA,CAAA;AAAA,IAIA;AAAA,GACJ;AAAA,EACA,eAAA,EAAiB,KAAA;AAAA,IACb,CAAA;AAAA;AAAA;AAAA,6GAAA,CAAA;AAAA,IAIA;AAAA,GACJ;AAAA,EACA,gBAAA,EAAkB,KAAA;AAAA,IACd,CAAA;AAAA;AAAA;AAAA;AAAA,yHAAA,CAAA;AAAA,IAKA;AAAA,GACJ;AAAA;AAAA,EAEA,cAAA,EAAgB,KAAA;AAAA,IACZ,CAAA;AAAA;AAAA;AAAA,2HAAA,CAAA;AAAA,IAIA;AAAA,GACJ;AAAA,EACA,WAAA,EAAa,KAAA;AAAA,IACT,CAAA;AAAA;AAAA;AAAA;AAAA,2HAAA,CAAA;AAAA,IAKA;AAAA,GACJ;AAAA,EACA,cAAA,EAAgB,KAAA;AAAA,IACZ,CAAA;AAAA;AAAA;AAAA,2HAAA,CAAA;AAAA,IAIA;AAAA,GACJ;AAAA,EACA,gBAAA,EAAkB,KAAA;AAAA,IACd,CAAA;AAAA;AAAA,mJAAA,CAAA;AAAA,IAGA;AAAA,GACJ;AAAA;AAAA,EAEA,IAAA,EAAM,KAAA;AAAA,IACF,CAAA;AAAA,6GAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA,EACA,OAAA,EAAS,KAAA;AAAA,IACL,CAAA,gMAAA,CAAA;AAAA,IACA;AAAA,GACJ;AAAA,EACA,WAAA,EAAa,KAAA;AAAA,IACT,CAAA,wIAAA,CAAA;AAAA,IACA;AAAA,GACJ;AAAA,EACA,YAAA,EAAc,KAAA;AAAA,IACV,CAAA;AAAA,mIAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA,EACA,IAAA,EAAM,KAAA;AAAA,IACF,CAAA;AAAA,4GAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA,EACA,UAAA,EAAY,KAAA;AAAA,IACR,CAAA;AAAA;AAAA,gHAAA,CAAA;AAAA,IAGA;AAAA,GACJ;AAAA,EACA,aAAA,EAAe,KAAA;AAAA,IACX,CAAA;AAAA,0IAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA,EACA,QAAA,EAAU,KAAA;AAAA,IACN,CAAA;AAAA,kIAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA,EACA,UAAA,EAAY,KAAA;AAAA,IACR,CAAA;AAAA,mIAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA;AAAA,EAEA,cAAA,EAAgB,KAAA;AAAA,IACZ,CAAA;AAAA,2HAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA,EACA,gBAAA,EAAkB,KAAA;AAAA,IACd,CAAA;AAAA;AAAA,6GAAA,CAAA;AAAA,IAGA;AAAA,GACJ;AAAA,EACA,YAAA,EAAc,KAAA;AAAA,IACV,CAAA,6IAAA,CAAA;AAAA,IACA;AAAA,GACJ;AAAA,EACA,YAAA,EAAc,KAAA;AAAA,IACV,CAAA;AAAA;AAAA;AAAA;AAAA,2DAAA,CAAA;AAAA,IAKA;AAAA,GACJ;AAAA,EACA,cAAA,EAAgB,KAAA;AAAA,IACZ,CAAA,mIAAA,CAAA;AAAA,IACA;AAAA,GACJ;AAAA,EACA,iBAAA,EAAmB,KAAA;AAAA,IACf,CAAA;AAAA,2HAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA,EACA,WAAA,EAAa,KAAA;AAAA,IACT,CAAA,uIAAA,CAAA;AAAA,IACA;AAAA,GACJ;AAAA,EACA,eAAA,EAAiB,KAAA;AAAA,IACb,CAAA,uIAAA,CAAA;AAAA,IACA;AAAA,GACJ;AAAA,EACA,YAAA,EAAc,KAAA;AAAA,IACV,CAAA,oIAAA,CAAA;AAAA,IACA;AAAA,GACJ;AAAA,EACA,aAAA,EAAe,KAAA;AAAA,IACX,CAAA,qIAAA,CAAA;AAAA,IACA;AAAA,GACJ;AAAA;AAAA,EAEA,eAAA,EAAiB,KAAA;AAAA,IACb,CAAA,6IAAA,CAAA;AAAA,IACA;AAAA,GACJ;AAAA,EACA,kBAAA,EAAoB,KAAA;AAAA,IAChB,CAAA,oIAAA,CAAA;AAAA,IACA;AAAA,GACJ;AAAA,EACA,gBAAA,EAAkB,KAAA;AAAA,IACd,CAAA;AAAA,yHAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA,EACA,mBAAA,EAAqB,KAAA;AAAA,IACjB,CAAA,wIAAA,CAAA;AAAA,IACA;AAAA,GACJ;AAAA,EACA,WAAA,EAAa,KAAA;AAAA,IACT,CAAA,oIAAA,CAAA;AAAA,IACA;AAAA,GACJ;AAAA;AAAA,EAEA,KAAA,EAAO,KAAA;AAAA,IACH,CAAA;AAAA,iIAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA,EACA,WAAA,EAAa,KAAA;AAAA,IACT,CAAA;AAAA,6HAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA;AAAA,EAEA,UAAA,EAAY,KAAA;AAAA,IACR,CAAA;AAAA,sHAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA,EACA,UAAA,EAAY,KAAA;AAAA,IACR,CAAA;AAAA;AAAA,8IAAA,CAAA;AAAA,IAGA;AAAA,GACJ;AAAA,EACA,SAAA,EAAW,KAAA;AAAA,IACP,CAAA,0IAAA,CAAA;AAAA,IACA;AAAA,GACJ;AAAA,EACA,YAAA,EAAc,KAAA;AAAA,IACV,CAAA;AAAA;AAAA,0IAAA,CAAA;AAAA,IAGA;AAAA,GACJ;AAAA,EACA,WAAA,EAAa,KAAA;AAAA,IACT,CAAA;AAAA,uGAAA,CAAA;AAAA,IAEA;AAAA,GACJ;AAAA;AAAA,EAEA,cAAA,EAAgB,KAAA;AAAA,IACZ,CAAA;AAAA;AAAA;AAAA,oJAAA,CAAA;AAAA,IAIA;AAAA,GACJ;AAAA,EACA,gBAAA,EAAkB,KAAA;AAAA,IACd,CAAA;AAAA;AAAA,8IAAA,CAAA;AAAA,IAGA;AAAA;AAER,CAAA;AAKO,IAAM,QAAA,GACT,CAAA,8kBAAA,CAAA;AAUG,IAAM,YAAA,GACT,CAAA,2uBAAA,CAAA;AAwBG,IAAM,eAAA,GAAkB,CAAC,CAAA,EAAW,IAAA,GAAO,OAC9C,CAAA,gCAAA,EAAmC,IAAI,CAAA,UAAA,EAAa,IAAI,CAAA,gFAAA,EACtB,CAAC,CAAA,mCAAA,EACA,CAAC,2DACoB,CAAC,CAAA,iDAAA,CAAA;AAatD,IAAM,aAAA,GAAgB,CAAC,CAAA,EAAW,IAAA,GAAO,EAAA,KAC5C,CAAA,gCAAA,EAAmC,IAAI,CAAA,UAAA,EAAa,IAAI,CAAA,sFAAA,EAChB,CAAC,CAAA,8EAAA,EACL,CAAC,CAAA,2EAAA,CAAA;AAMlC,IAAM,QAAA,GAA+D;AAAA,EACxE,UAAA,EAAY,CAAA,+WAAA,CAAA;AAAA,EACZ,KAAA,EAAY,CAAA,yTAAA,CAAA;AAAA,EACZ,OAAA,EAAY,CAAA,uUAAA;AAChB,CAAA;AAKO,IAAM,aAAA,GACT,CAAA,qMAAA,CAAA;AAOG,IAAM,WAAA,GACT,CAAA,sJAAA,CAAA;AAOG,IAAM,cAAA,GACT,CAAA,6NAAA,CAAA;AAOG,IAAM,gBAAA,GACT,CAAA,6XAAA,CAAA;AAOG,IAAM,eAAA,GACT,CAAA,6NAAA,CAAA;AAKG,IAAM,iBAAA,GACT,CAAA,6NAAA,CAAA;AAKG,IAAM,iBAAA,GAAoB,KAAA;AAAA,EAC7B,CAAA,0JAAA,CAAA;AAAA,EAGA;AACJ,CAAA;;;AC3xBA,IAAI,eAAA,GAAkB,KAAA;AAEf,SAAS,yBAAA,GAAkC;AAC9C,EAAA,IAAI,eAAA,EAAiB;AACrB,EAAA,eAAA,GAAkB,IAAA;AAClB,EAAA,MAAM,KAAM,SAAA,CAA+D,eAAA;AAC3E,EAAA,IAAI,EAAA,EAAI;AACJ,IAAA,IAAI;AAAE,MAAA,EAAA,CAAG,eAAA,GAAkB,IAAA;AAAA,IAAM,CAAA,CAAA,MAAQ;AAAA,IAAoB;AAAA,EACjE;AACJ;AAOO,SAAS,eAAA,CACZ,IACA,cAAA,EACU;AACV,EAAA,MAAM,KAAK,MAAA,CAAO,cAAA;AAClB,EAAA,IAAI,CAAC,EAAA,EAAI,OAAO,MAAM;AAAA,EAAC,CAAA;AAEvB,EAAA,MAAM,SAAS,MAAY;AACvB,IAAA,IAAI,GAAG,KAAA,CAAM,OAAA,KAAY,MAAA,IAAU,CAAC,GAAG,WAAA,EAAa;AACpD,IAAA,MAAM,cAAc,cAAA,EAAe;AACnC,IAAA,MAAM,MAAA,GAAc,EAAA,CAAG,qBAAA,EAAsB,CAAE,MAAA;AAC/C,IAAA,MAAM,QAAA,GAAc,EAAA,CAAG,SAAA,GAAY,EAAA,CAAG,MAAA;AACtC,IAAA,MAAM,IAAA,GAAc,WAAA,GAAc,MAAA,IAAU,QAAA,GAAW,CAAA;AACvD,IAAA,EAAA,CAAG,KAAA,CAAM,GAAA,GAAM,IAAA,GACT,CAAA,EAAG,WAAW,CAAA,EAAA,CAAA,GACd,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAA,GAAW,MAAA,GAAS,CAAC,CAAC,CAAA,EAAA,CAAA;AAAA,EAC/C,CAAA;AAEA,EAAA,EAAA,CAAG,gBAAA,CAAiB,UAAU,MAAM,CAAA;AACpC,EAAA,EAAA,CAAG,gBAAA,CAAiB,UAAU,MAAM,CAAA;AACpC,EAAA,OAAO,MAAM;AACT,IAAA,EAAA,CAAG,mBAAA,CAAoB,UAAU,MAAM,CAAA;AACvC,IAAA,EAAA,CAAG,mBAAA,CAAoB,UAAU,MAAM,CAAA;AAAA,EAC3C,CAAA;AACJ;AAQO,SAAS,yBAAyB,EAAA,EAA6B;AAClE,EAAA,MAAM,KAAK,MAAA,CAAO,cAAA;AAClB,EAAA,IAAI,CAAC,EAAA,EAAI,OAAO,MAAM;AAAA,EAAC,CAAA;AAEvB,EAAA,MAAM,SAAS,MAAY;AACvB,IAAA,IAAI,CAAC,EAAA,CAAG,WAAA,IAAe,EAAA,CAAG,iBAAiB,IAAA,EAAM;AAEjD,IAAA,EAAA,CAAG,MAAM,SAAA,GAAY,EAAA;AACrB,IAAA,MAAM,IAAA,GAAW,GAAG,qBAAA,EAAsB;AAC1C,IAAA,MAAM,QAAA,GAAW,EAAA,CAAG,SAAA,GAAY,EAAA,CAAG,MAAA;AACnC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,IAAU,QAAA,GAAW,CAAA,CAAA;AAC3C,IAAA,IAAI,WAAW,CAAA,EAAG;AACd,MAAA,EAAA,CAAG,KAAA,CAAM,SAAA,GAAY,CAAA,WAAA,EAAc,CAAC,QAAQ,CAAA,GAAA,CAAA;AAAA,IAChD;AAAA,EACJ,CAAA;AAEA,EAAA,EAAA,CAAG,gBAAA,CAAiB,UAAU,MAAM,CAAA;AACpC,EAAA,EAAA,CAAG,gBAAA,CAAiB,UAAU,MAAM,CAAA;AACpC,EAAA,OAAO,MAAM;AACT,IAAA,EAAA,CAAG,mBAAA,CAAoB,UAAU,MAAM,CAAA;AACvC,IAAA,EAAA,CAAG,mBAAA,CAAoB,UAAU,MAAM,CAAA;AAAA,EAC3C,CAAA;AACJ;;;ACxFA,IAAM,SAAA,GAAwB,CAAC,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,KAAK,CAAA;AAG9E,IAAM,eAAA,mBAAkB,IAAI,GAAA,CAAI,CAAC,KAAA,EAAO,QAAQ,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAK,CAAC,CAAA;AAO3E,SAAS,2BAAA,GAAoC;AACzC,EAAA,IAAI,QAAA,CAAS,cAAA,CAAe,2BAA2B,CAAA,EAAG;AAC1D,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,EAAA,KAAA,CAAM,EAAA,GAAK,2BAAA;AACX,EAAA,KAAA,CAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAOpB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AACnC;AAEO,IAAM,SAAN,MAAa;AAAA,EAmChB,WAAA,CACY,cAAA,EACA,iBAAA,EACA,cAAA,EACA,gBAAA,EACA,iBACA,kBAAA,EACA,oBAAA,EACR,mBAAA,EACA,eAAA,EACA,iBAAA,EACA,UAAA,EACA,kBACQ,WAAA,EACR,aAAA,EACA,SAAA,EACA,eAAA,EACA,WAAA,EACA,KAAA,EACA,GAAA,GAAmC,sBAAA,EACnC,MAAA,GAAmC,cAAA,CAAe,MAAA,EAC1C,gBAAA,GAAwC,IAAA,EAClD;AArBU,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AACA,IAAA,IAAA,CAAA,iBAAA,GAAA,iBAAA;AACA,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AACA,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AACA,IAAA,IAAA,CAAA,eAAA,GAAA,eAAA;AACA,IAAA,IAAA,CAAA,kBAAA,GAAA,kBAAA;AACA,IAAA,IAAA,CAAA,oBAAA,GAAA,oBAAA;AAMA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAQA,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AAjDZ,IAAA,IAAA,CAAQ,aAAA,GAA0C,IAAA;AAClD,IAAA,IAAA,CAAQ,WAAA,GAA0C,IAAA;AAClD,IAAA,IAAA,CAAQ,YAAA,GAAiB,KAAA;AACzB,IAAA,IAAA,CAAQ,YAAA,uBAAqB,GAAA,EAAiC;AAG9D,IAAA,IAAA,CAAQ,cAAA,GAAiB,KAAA;AAOzB,IAAA,IAAA,CAAQ,UAAA,GAA6C,IAAA;AACrD,IAAA,IAAA,CAAQ,MAAA,GAA6C,IAAA;AACrD,IAAA,IAAA,CAAQ,SAAA,GAAoB,IAAA;AAG5B,IAAA,IAAA,CAAQ,YAAA,GAAqC,IAAA;AAE7C,IAAA,IAAA,CAAQ,mBAA+B,MAAM;AAAA,IAAC,CAAA;AAI9C,IAAA,IAAA,CAAQ,mBAA0E,EAAC;AACnF,IAAA,IAAA,CAAQ,gBAAA,uBAAwB,GAAA,EAAY;AAC5C,IAAA,IAAA,CAAQ,UAAA,GAAoB,IAAA;AAyBxB,IAAA,IAAA,CAAK,KAAA,GAAiB,KAAA;AACtB,IAAA,IAAA,CAAK,GAAA,GAAiB,GAAA;AACtB,IAAA,IAAA,CAAK,MAAA,GAAiB,MAAA;AACtB,IAAA,IAAA,CAAK,SAAA,GAAiB,gBAAA;AACtB,IAAA,IAAA,CAAK,aAAA,GAAiB,aAAA;AACtB,IAAA,IAAA,CAAK,SAAA,GAAiB,SAAA;AACtB,IAAA,IAAA,CAAK,cAAA,GAAiB,eAAA;AACtB,IAAA,IAAA,CAAK,WAAA,GAAiB,WAAA;AAEtB,IAAA,2BAAA,EAA4B;AAE5B,IAAA,IAAA,CAAK,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACtC,IAAA,IAAA,CAAK,eAAe,KAAK,CAAA;AAGzB,IAAA,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC1C,IAAA,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,iBAAiB,CAAA;AAC3C,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,QAAA,CAAS,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA;AACrC,IAAA,IAAA,CAAK,gBAAA,GAAmB,wBAAA,CAAyB,IAAA,CAAK,MAAM,CAAA;AAG5D,IAAA,IAAA,CAAK,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC7C,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO;AAAA,MAChC,OAAA,EAAY,MAAA;AAAA,MACZ,UAAA,EAAY,QAAA;AAAA,MACZ,GAAA,EAAY,KAAA;AAAA,MACZ,IAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAY,GAAA;AAAA,MACZ,QAAA,EAAY;AAAA,KACf,CAAA;AAED,IAAA,IAAI,mBAAA,EAAqB;AACrB,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAC3C,MAAA,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY,IAAA,CAAK,UAAU,CAAA;AAAA,IAC9C;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,aAAA,CAAc,aAAA,EAAe,KAAK,CAAA;AACxD,IAAA,IAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AAC5C,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,IAAA,CAAK,cAAA,CAAe,QAAA,EAAU,IAAA,CAAK,SAAS,CAAA;AAAA,IAChD,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,WAAA,CAAY,KAAK,SAAS,CAAA;AAE/B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,SAAA,EAAW,OAAO,KAAK,CAAA;AACrD,IAAA,IAAA,CAAK,KAAA,CAAM,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACxC,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,IAAA,CAAK,cAAA,CAAe,WAAA,EAAa,IAAA,CAAK,KAAK,CAAA;AAAA,IAC/C,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,WAAA,CAAY,KAAK,KAAK,CAAA;AAE3B,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,WAAA,CAAY,KAAK,MAAA,CAAO,aAAA,EAAe,OAAO,KAAK,CAAA;AACtE,IAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACzC,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,IAAA,CAAK,cAAA,CAAe,YAAA,EAAc,IAAA,CAAK,MAAM,CAAA;AAAA,IACjD,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,WAAA,CAAY,KAAK,MAAM,CAAA;AAE5B,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,IAAA,CAAK,WAAW,IAAA,CAAK,KAAA,EAAO,KAAK,MAAM,CAAA;AAG7D,IAAA,IAAA,CAAK,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO;AAAA,MACjC,OAAA,EAAY,MAAA;AAAA,MACZ,UAAA,EAAY,QAAA;AAAA,MACZ,GAAA,EAAY,KAAA;AAAA,MACZ,UAAA,EAAY;AAAA,KACf,CAAA;AAKD,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAK,WAAA,CAAY,eAAA,IAAmB,UAAU,CAAC,CAAA,EAAG,OAAO,KAAK,CAAA;AACrF,IAAA,IAAA,CAAK,eAAA,CAAgB,MAAM,OAAA,GAAU,MAAA;AACrC,IAAA,IAAA,CAAK,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC/C,IAAA,IAAA,CAAK,WAAA,CAAY,MAAM,OAAA,GAAU,MAAA;AAEjC,IAAA,IAAI,iBAAA,EAAmB;AACnB,MAAA,IAAA,CAAK,aAAA,GAAgB,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACpD,MAAA,IAAA,CAAK,aAAA,CAAc,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,qBAAA;AACvC,MAAA,IAAA,CAAK,cAAc,SAAA,GAAY,qBAAA;AAC/B,MAAA,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,aAAA,EAAe,KAAA,EAAO,KAAK,CAAA;AACxD,MAAA,IAAA,CAAK,aAAA,CAAc,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AAChD,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,MAC5B,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,WAAA,CAAY,KAAK,aAAa,CAAA;AACnC,MAAA,IAAA,CAAK,UAAA,CAAW,WAAA,CAAY,IAAA,CAAK,aAAa,CAAA;AAAA,IAClD;AAEA,IAAA,IAAI,eAAA,EAAiB;AACjB,MAAA,IAAA,CAAK,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAClD,MAAA,IAAA,CAAK,WAAA,CAAY,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,aAAA;AACrC,MAAA,IAAA,CAAK,YAAY,SAAA,GAAY,aAAA;AAC7B,MAAA,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,WAAA,EAAa,KAAA,EAAO,KAAK,CAAA;AACtD,MAAA,IAAA,CAAK,WAAA,CAAY,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AAC9C,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,MACzB,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,WAAA,CAAY,KAAK,WAAW,CAAA;AACjC,MAAA,IAAA,CAAK,UAAA,CAAW,WAAA,CAAY,IAAA,CAAK,WAAW,CAAA;AAAA,IAChD;AAEA,IAAA,IAAI,UAAA,EAAY;AACZ,MAAA,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC7C,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,cAAA;AAChC,MAAA,IAAA,CAAK,MAAA,CAAO,SAAA,GAAY,IAAA,CAAK,SAAA,GAAY,QAAA,GAAW,YAAA;AACpD,MAAA,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,KAAK,SAAS,CAAA;AAC1D,MAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACzC,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,IAAA,CAAK,SAAA,GAAY,CAAC,IAAA,CAAK,SAAA;AACvB,QAAA,IAAA,CAAK,MAAA,CAAQ,SAAA,GAAY,IAAA,CAAK,SAAA,GAAY,QAAA,GAAW,YAAA;AACrD,QAAA,IAAA,CAAK,mBAAmB,IAAA,CAAK,MAAA,EAAS,IAAA,CAAK,KAAA,EAAO,KAAK,SAAS,CAAA;AAChE,QAAA,IAAA,CAAK,WAAA,GAAc,KAAK,SAAS,CAAA;AAAA,MACrC,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,WAAA,CAAY,KAAK,MAAM,CAAA;AAC5B,MAAA,IAAA,CAAK,UAAA,CAAW,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA;AAAA,IAC3C;AAEA,IAAA,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,IAAA,CAAK,SAAA,EAAW,KAAK,UAAU,CAAA;AAG9C,IAAA,IAAA,CAAK,eAAA,GAAkB,CAAC,CAAA,KAAkB;AACtC,MAAA,IACI,CAAC,IAAA,CAAK,EAAA,CAAG,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,IAClC,CAAC,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,EACxC;AACE,QAAA,IAAA,CAAK,aAAA,EAAc;AAAA,MACvB;AAAA,IACJ,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,IAAA,CAAK,eAAA,EAAiB,IAAI,CAAA;AAAA,EACjE;AAAA;AAAA,EAIA,OAAA,GAAgB;AACZ,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,IAAA,CAAK,OAAO,MAAA,EAAO;AACnB,IAAA,QAAA,CAAS,mBAAA,CAAoB,OAAA,EAAS,IAAA,CAAK,eAAA,EAAiB,IAAI,CAAA;AAAA,EACpE;AAAA,EAEA,eAAe,IAAA,EAAyB;AACpC,IAAA,IAAI,KAAK,MAAA,CAAO,aAAA,KAAkB,MAAM,IAAA,CAAK,WAAA,CAAY,KAAK,MAAM,CAAA;AAAA,EACxE;AAAA,EAEA,cAAc,MAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AACpB,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACzB,IAAA,IAAA,CAAK,aAAA,CAAc,SAAA,GAAY,MAAA,GAAS,oBAAA,GAAuB,qBAAA;AAC/D,IAAA,IAAA,CAAK,cAAc,KAAA,GAAQ,MAAA,GAAS,KAAK,MAAA,CAAO,mBAAA,GAAsB,KAAK,MAAA,CAAO,qBAAA;AAClF,IAAA,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,aAAA,EAAe,IAAA,CAAK,OAAO,MAAM,CAAA;AAE9D,IAAA,IAAI,KAAK,cAAA,EAAgB;AACrB,MAAA,IAAA,CAAK,SAAA,CAAU,KAAK,aAAA,EAAe,IAAA,CAAK,WAAW,IAAA,CAAK,aAAa,IAAI,CAAC,CAAA;AAAA,IAC9E;AAAA,EACJ;AAAA,EAEA,qBAAqB,MAAA,EAAuB;AACxC,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACtB,IAAA,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,OAAO,MAAM,CAAA;AAAA,EAC/D;AAAA,EAEA,aAAa,MAAA,EAAuB;AAChC,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAClB,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AACjB,IAAA,IAAA,CAAK,MAAA,CAAO,SAAA,GAAY,MAAA,GAAS,QAAA,GAAW,YAAA;AAC5C,IAAA,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,OAAO,MAAM,CAAA;AACvD,IAAA,IAAI,KAAK,cAAA,EAAgB;AACrB,MAAA,IAAA,CAAK,SAAA,CAAU,KAAK,MAAA,EAAQ,IAAA,CAAK,WAAW,IAAA,CAAK,MAAM,IAAI,CAAC,CAAA;AAAA,IAChE;AAAA,EACJ;AAAA,EAEA,SAAS,KAAA,EAAyB;AAC9B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,eAAe,KAAK,CAAA;AACzB,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,IAAI,KAAK,UAAA,EAAY,IAAA,CAAK,mBAAmB,IAAA,CAAK,UAAA,EAAY,OAAO,KAAK,CAAA;AAC1E,IAAA,IAAI,IAAA,CAAK,eAAe,IAAA,CAAK,kBAAA,CAAmB,KAAK,aAAA,EAAe,KAAA,EAAO,KAAK,YAAY,CAAA;AAC5F,IAAA,IAAI,KAAK,WAAA,EAAa,IAAA,CAAK,mBAAmB,IAAA,CAAK,WAAA,EAAa,OAAO,KAAK,CAAA;AAC5E,IAAA,IAAI,IAAA,CAAK,QAAQ,IAAA,CAAK,kBAAA,CAAmB,KAAK,MAAA,EAAQ,KAAA,EAAO,KAAK,SAAS,CAAA;AAC3E,IAAA,IAAA,CAAK,oBAAA,CAAqB,IAAA,CAAK,SAAA,EAAW,KAAA,EAAO,KAAK,CAAA;AACtD,IAAA,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA;AAChD,IAAA,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,KAAK,CAAA;AACjD,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,GAAG,CAAA,IAAK,KAAK,YAAA,EAAc;AACtC,MAAA,IAAA,CAAK,sBAAA,CAAuB,GAAA,EAAK,KAAA,EAAO,CAAA,KAAM,KAAK,cAAc,CAAA;AAAA,IACrE;AACA,IAAA,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,UAAA,GAAa,KAAA,CAAM,UAAA;AAC1C,IAAA,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,eAAA,EAAiB,KAAA,EAAO,KAAK,CAAA;AAAA,EAC9D;AAAA,EAEA,UAAU,CAAA,EAAqB;AAC3B,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAA;AACrB,IAAA,IAAA,CAAK,sBAAA,CAAuB,IAAA,CAAK,SAAA,EAAW,CAAC,CAAA;AAAA,EACjD;AAAA,EAEA,aAAa,EAAA,EAAqB;AAC9B,IAAA,IAAA,CAAK,SAAA,GAAY,EAAA;AACjB,IAAA,IAAA,CAAK,MAAM,WAAA,GAAc,EAAA;AAAA,EAC7B;AAAA,EAEA,kBAAkB,CAAA,EAAsC;AACpD,IAAA,IAAI,IAAA,CAAK,cAAA,MAAoB,CAAA,IAAK,IAAA,CAAA,EAAO;AACzC,IAAA,IAAI,KAAK,cAAA,EAAgB;AACrB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,KAAK,cAAc,CAAA;AACtD,MAAA,IAAI,MAAM,IAAA,CAAK,sBAAA,CAAuB,IAAA,EAAM,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,IACjE;AACA,IAAA,IAAA,CAAK,iBAAiB,CAAA,IAAK,IAAA;AAC3B,IAAA,IAAI,CAAA,EAAG;AACH,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA;AACpC,MAAA,IAAI,MAAM,IAAA,CAAK,sBAAA,CAAuB,IAAA,EAAM,IAAA,CAAK,OAAO,IAAI,CAAA;AAC5D,MAAA,IAAA,CAAK,gBAAgB,WAAA,GAAc,CAAA;AAAA,IACvC;AAAA,EACJ;AAAA,EAEA,gBAAgB,QAAA,EAAyB;AACrC,IAAA,IAAI,IAAA,CAAK,mBAAmB,QAAA,EAAU;AACtC,IAAA,IAAA,CAAK,cAAA,GAAiB,QAAA;AACtB,IAAA,MAAM,UAAA,GAAa,WAAW,MAAA,GAAS,EAAA;AACvC,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,YAAA,CAAa,MAAA,EAAO,EAAG;AAC1C,MAAA,GAAA,CAAI,MAAM,OAAA,GAAU,UAAA;AAAA,IACxB;AACA,IAAA,IAAA,CAAK,WAAA,CAAY,MAAM,OAAA,GAAU,UAAA;AACjC,IAAA,IAAA,CAAK,eAAA,CAAgB,KAAA,CAAM,OAAA,GAAU,QAAA,GAAW,EAAA,GAAK,MAAA;AAGrD,IAAA,MAAM,gBAAgB,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,iBAAA,GAAoB,KAAK,GAAA,CAAI,WAAA;AACvE,IAAA,KAAA,MAAW,GAAA,IAAO,CAAC,IAAA,CAAK,aAAA,EAAe,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,MAAM,CAAA,EAAG;AACpF,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,GAAA,CAAI,MAAM,KAAA,GAAQ,aAAA;AAClB,MAAA,GAAA,CAAI,MAAM,MAAA,GAAS,aAAA;AAAA,IACvB;AAIA,IAAA,MAAM,KAAA,GAAQ,WAAW,CAAA,GAAI,EAAA;AAC7B,IAAA,IAAI,KAAK,aAAA,EAAe;AACpB,MAAA,IAAA,CAAK,SAAA,CAAU,KAAK,aAAA,EAAe,IAAA,CAAK,WAAW,IAAA,CAAK,aAAa,IAAI,KAAK,CAAA;AAAA,IAClF;AACA,IAAA,IAAI,KAAK,WAAA,EAAa;AAClB,MAAA,IAAA,CAAK,SAAA,CAAU,KAAK,WAAA,EAAa,IAAA,CAAK,WAAW,IAAA,CAAK,WAAW,IAAI,KAAK,CAAA;AAAA,IAC9E;AACA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACb,MAAA,IAAA,CAAK,SAAA,CAAU,KAAK,MAAA,EAAQ,IAAA,CAAK,WAAW,IAAA,CAAK,MAAM,IAAI,KAAK,CAAA;AAAA,IACpE;AAGA,IAAA,IAAI,KAAK,UAAA,EAAY;AACjB,MAAA,MAAM,YAAA,GAAe,QAAA,GACf,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,qBAAA,EAAuB,EAAE,CAAA,GAC3C,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,mBAAA,EAAqB,EAAE,CAAA;AAC/C,MAAA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,UAAA,EAAY,YAAY,CAAA;AAAA,IAChD;AAAA,EACJ;AAAA,EAEA,oBAAoB,OAAA,EAAsE;AACtF,IAAA,IAAA,CAAK,gBAAA,GAAmB,OAAA;AAAA,EAC5B;AAAA,EAEA,wBAAA,CAAyB,OAAe,MAAA,EAAuB;AAC3D,IAAA,IAAI,MAAA,EAAQ;AACR,MAAA,IAAA,CAAK,gBAAA,CAAiB,IAAI,KAAK,CAAA;AAAA,IACnC,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,KAAK,CAAA;AAAA,IACtC;AACA,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EAC3B;AAAA;AAAA,EAGA,gBAAA,CAAiB,MAAe,OAAA,EAAwB;AACpD,IAAA,IAAA,CAAK,UAAA,GAAa,OAAA;AAClB,IAAA,MAAM,SAAS,OAAA,IAAW,IAAA;AAC1B,IAAA,IAAI,MAAA,EAAQ;AACR,MAAA,IAAA,CAAK,gBAAA,CAAiB,IAAI,KAAK,CAAA;AAAA,IACnC,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,KAAK,CAAA;AAAA,IACtC;AACA,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EAC3B;AAAA;AAAA,EAIQ,eAAe,KAAA,EAAsC;AACzD,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,IAAA,GAAA,CAAI,KAAA,GAAQ,eAAA;AACZ,IAAA,GAAA,CAAI,SAAA,GAAY,WAAA;AAChB,IAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,EAAK,KAAA,EAAO,KAAK,CAAA;AACzC,IAAA,GAAA,CAAI,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACjC,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,IAAA,CAAK,oBAAA,IAAuB;AAAA,IAChC,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AACpB,IAAA,OAAO,GAAA;AAAA,EACX;AAAA;AAAA,EAIQ,aAAA,CAAc,QAAoB,KAAA,EAAsC;AAC5E,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,IAAA,IAAA,CAAK,oBAAA,CAAqB,GAAA,EAAK,KAAA,EAAO,KAAK,CAAA;AAC3C,IAAA,IAAA,CAAK,sBAAA,CAAuB,KAAK,MAAM,CAAA;AACvC,IAAA,OAAO,GAAA;AAAA,EACX;AAAA,EAEQ,sBAAA,CAAuB,KAAwB,MAAA,EAA0B;AAC7E,IAAA,MAAM,KAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAA,CAAkC,MAAM,CAAA,IAAK,MAAA;AACxE,IAAA,GAAA,CAAI,KAAA,GAAQ,KAAA;AACZ,IAAA,GAAA,CAAI,SAAA,GAAY,YAAY,MAAM,CAAA;AAAA,EACtC;AAAA,EAEQ,oBAAA,CAAqB,GAAA,EAAwB,KAAA,EAAmB,MAAA,EAAuB;AAC3F,IAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,GAAS,MAAA,CAAO,MAAM,CAAA;AAClC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,MACrB,UAAA,EAAgB,MAAA,GAAS,KAAA,CAAM,EAAA,CAAG,QAAA,GAAW,aAAA;AAAA,MAC7C,OAAgB,MAAA,GAAS,KAAA,CAAM,EAAA,CAAG,UAAA,GAAa,MAAM,MAAA,CAAO,QAAA;AAAA,MAC5D,QAAgB,CAAA,UAAA,EAAa,MAAA,GAAS,MAAM,EAAA,CAAG,MAAA,GAAS,MAAM,UAAU,CAAA,CAAA;AAAA,MACxE,YAAA,EAAgB,KAAA;AAAA,MAChB,OAAA,EAAgB,SAAA;AAAA,MAChB,MAAA,EAAgB,SAAA;AAAA,MAChB,OAAA,EAAgB,MAAA;AAAA,MAChB,OAAA,EAAgB,MAAA;AAAA,MAChB,UAAA,EAAgB,QAAA;AAAA,MAChB,GAAA,EAAgB,KAAA;AAAA,MAChB,UAAA,EAAgB,GAAA;AAAA,MAChB,MAAA,EAAgB,MAAA;AAAA,MAChB,UAAA,EAAgB;AAAA,KACnB,CAAA;AAAA,EACL;AAAA;AAAA,EAIQ,iBAAA,GAA0B;AAC9B,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO;AAAA,MAC7B,QAAA,EAAc,OAAA;AAAA,MACd,MAAA,EAAc,MAAA;AAAA,MACd,OAAA,EAAc,MAAA;AAAA,MACd,UAAA,EAAc,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,UAAA;AAAA,MACjC,MAAA,EAAc,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MAChD,YAAA,EAAc,KAAA;AAAA,MACd,OAAA,EAAc,OAAA;AAAA,MACd,QAAA,EAAc,OAAA;AAAA,MACd,SAAA,EAAc,OAAA;AAAA,MACd,SAAA,EAAc,MAAA;AAAA,MACd,SAAA,EAAc,QAAA;AAAA,MACd,SAAA,EAAc,wDAAA;AAAA,MACd,UAAA,EAAc,KAAK,GAAA,CAAI,mBAAA;AAAA,MACvB,QAAA,EAAc,KAAK,GAAA,CAAI,iBAAA;AAAA,MACvB,cAAA,EAAgB,MAAA;AAAA,MAChB,cAAA,EAAgB,CAAA,kCAAA;AAAA,KACnB,CAAA;AAAA,EACL;AAAA,EAEQ,cAAA,CAAe,IAAgB,SAAA,EAAoC;AACvE,IAAA,IAAI,IAAA,CAAK,iBAAiB,EAAA,EAAI;AAC1B,MAAA,IAAA,CAAK,aAAA,EAAc;AACnB,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,OAAA,GAAU,KAAK,YAAA,KAAiB,IAAA;AACtC,IAAA,IAAA,CAAK,YAAA,GAAe,EAAA;AACpB,IAAA,IAAA,CAAK,qBAAqB,IAAA,CAAK,SAAA,EAAc,IAAA,CAAK,KAAA,EAAO,OAAO,QAAQ,CAAA;AACxE,IAAA,IAAA,CAAK,mBAAmB,IAAA,CAAK,KAAA,EAAgB,IAAA,CAAK,KAAA,EAAO,OAAO,WAAW,CAAA;AAC3E,IAAA,IAAA,CAAK,mBAAmB,IAAA,CAAK,MAAA,EAAgB,IAAA,CAAK,KAAA,EAAO,OAAO,YAAY,CAAA;AAC5E,IAAA,IAAA,CAAK,mBAAmB,IAAA,CAAK,eAAA,EAAiB,IAAA,CAAK,KAAA,EAAO,OAAO,UAAU,CAAA;AAE3E,IAAA,IAAA,CAAK,qBAAqB,EAAE,CAAA;AAE5B,IAAA,MAAM,IAAA,GAAO,UAAU,qBAAA,EAAsB;AAC7C,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO;AAAA,MAC7B,OAAA,EAAS,OAAA;AAAA,MACT,IAAA,EAAS,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAA,CAAA;AAAA,MACrB,GAAA,EAAS,CAAA,EAAG,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,EAAA;AAAA,KAC9B,CAAA;AAED,IAAA,qBAAA,CAAsB,MAAM;AACxB,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,qBAAA,EAAsB;AAC7C,MAAA,IAAI,EAAA,CAAG,KAAA,GAAQ,MAAA,CAAO,UAAA,GAAa,CAAA,EAAG;AAClC,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,IAAA,GAAO,CAAA,EAAG,OAAO,UAAA,GAAa,EAAA,CAAG,QAAQ,CAAC,CAAA,EAAA,CAAA;AAAA,MAChE;AACA,MAAA,IAAI,EAAA,CAAG,MAAA,GAAS,MAAA,CAAO,WAAA,GAAc,CAAA,EAAG;AACpC,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,GAAA,GAAM,CAAA,EAAG,KAAK,GAAA,GAAM,EAAA,CAAG,SAAS,CAAC,CAAA,EAAA,CAAA;AAAA,MACvD;AAAA,IACJ,CAAC,CAAA;AAED,IAAA,IAAI,CAAC,OAAA,EAAS,IAAA,CAAK,gBAAA,IAAmB;AAAA,EAC1C;AAAA,EAEQ,qBAAqB,EAAA,EAAsB;AAC/C,IAAA,IAAA,CAAK,OAAO,SAAA,GAAY,EAAA;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,QAAA,GAAW,EAAA,KAAO,QAAA,GAAW,OAAA,GAAU,EAAA,KAAO,WAAA,GAAc,OAAA,GAAU,EAAA,KAAO,UAAA,GAAa,OAAA,GAAU,OAAA;AAEtH,IAAA,IAAI,OAAO,QAAA,EAAU;AACjB,MAAA,MAAM,aAAA,GAAwD;AAAA,QAC1D,EAAE,KAAA,EAAO,aAAA,EAAiB,OAAO,IAAA,CAAK,MAAA,CAAO,OAAO,WAAA,EAAY;AAAA,QAChE,EAAE,KAAA,EAAO,QAAA,EAAiB,OAAO,IAAA,CAAK,MAAA,CAAO,OAAO,MAAA,EAAO;AAAA,QAC3D,EAAE,KAAA,EAAO,MAAA,EAAiB,OAAO,IAAA,CAAK,MAAA,CAAO,OAAO,IAAA,EAAK;AAAA,QACzD,EAAE,KAAA,EAAO,MAAA,EAAiB,OAAO,IAAA,CAAK,MAAA,CAAO,OAAO,IAAA,EAAK;AAAA,QACzD,EAAE,KAAA,EAAO,MAAA,EAAiB,OAAO,IAAA,CAAK,MAAA,CAAO,OAAO,IAAA,EAAK;AAAA,QACzD,EAAE,KAAA,EAAO,YAAA,EAAiB,OAAO,IAAA,CAAK,MAAA,CAAO,OAAO,UAAA,EAAW;AAAA,QAC/D,EAAE,KAAA,EAAO,eAAA,EAAiB,OAAO,IAAA,CAAK,MAAA,CAAO,OAAO,aAAA,EAAc;AAAA,QAClE,EAAE,KAAA,EAAO,aAAA,EAAiB,OAAO,IAAA,CAAK,MAAA,CAAO,OAAO,WAAA,EAAY;AAAA,QAChE,EAAE,KAAA,EAAO,MAAA,EAAiB,OAAO,IAAA,CAAK,MAAA,CAAO,OAAO,IAAA,EAAK;AAAA,QACzD,EAAE,KAAA,EAAO,SAAA,EAAiB,OAAO,IAAA,CAAK,MAAA,CAAO,OAAO,OAAA,EAAQ;AAAA,QAC5D,EAAE,KAAA,EAAO,UAAA,EAAiB,OAAO,IAAA,CAAK,MAAA,CAAO,OAAO,QAAA,EAAS;AAAA,QAC7D,EAAE,KAAA,EAAO,SAAA,EAAiB,OAAO,IAAA,CAAK,MAAA,CAAO,OAAO,OAAA,EAAQ;AAAA,QAC5D,EAAE,KAAA,EAAO,SAAA,EAAiB,OAAO,IAAA,CAAK,MAAA,CAAO,OAAO,OAAA;AAAQ,OAChE;AACA,MAAA,KAAA,MAAW,OAAO,aAAA,EAAe;AAC7B,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAO,GAAA,CAAI,KAAA,KAAU,IAAA,CAAK,aAAA,EAAe,KAAA,EAAO,WAAA,CAAY,GAAA,CAAI,KAAK,CAAC,CAAA;AACnG,QAAA,GAAA,CAAI,gBAAA,CAAiB,SAAS,MAAM;AAChC,UAAA,IAAA,CAAK,gBAAgB,GAAA,CAAI,KAAA;AACzB,UAAA,IAAA,CAAK,sBAAA,CAAuB,IAAA,CAAK,SAAA,EAAW,GAAA,CAAI,KAAK,CAAA;AACrD,UAAA,IAAA,CAAK,cAAA,CAAe,IAAI,KAAK,CAAA;AAC7B,UAAA,IAAA,CAAK,aAAA,EAAc;AAAA,QACvB,CAAC,CAAA;AACD,QAAA,IAAA,CAAK,MAAA,CAAO,YAAY,GAAG,CAAA;AAAA,MAC/B;AAAA,IACJ,CAAA,MAAA,IAAW,OAAO,WAAA,EAAa;AAC3B,MAAA,MAAM,QAAA,GAAwB,CAAC,IAAA,EAAM,IAAA,EAAM,OAAO,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA;AAC/E,MAAA,MAAM,KAAA,GAAwB,CAAC,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA;AAE/C,MAAA,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK,kBAAA,CAAmB,UAAU,CAAC,CAAA;AAC3D,MAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACvB,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,EAAE,CAAA,IAAK,EAAA;AAC9C,QAAA,MAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,EAAA,KAAO,IAAA,CAAK,WAAW,KAAK,CAAA;AAC9D,QAAA,GAAA,CAAI,gBAAA,CAAiB,SAAS,MAAM;AAChC,UAAA,IAAA,CAAK,SAAA,GAAY,EAAA;AACjB,UAAA,IAAA,CAAK,MAAM,WAAA,GAAc,OAAA;AACzB,UAAA,IAAA,CAAK,kBAAkB,EAAe,CAAA;AACtC,UAAA,IAAA,CAAK,aAAA,EAAc;AAAA,QACvB,CAAC,CAAA;AACD,QAAA,IAAA,CAAK,MAAA,CAAO,YAAY,GAAG,CAAA;AAAA,MAC/B;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK,kBAAA,CAAmB,SAAS,CAAC,CAAA;AAC1D,MAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACpB,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,EAAE,CAAA,IAAK,EAAA;AAC9C,QAAA,MAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,SAAS,EAAA,KAAO,IAAA,CAAK,WAAW,KAAK,CAAA;AAC9D,QAAA,GAAA,CAAI,gBAAA,CAAiB,SAAS,MAAM;AAChC,UAAA,IAAA,CAAK,SAAA,GAAY,EAAA;AACjB,UAAA,IAAA,CAAK,MAAM,WAAA,GAAc,OAAA;AACzB,UAAA,IAAA,CAAK,kBAAkB,EAAe,CAAA;AACtC,UAAA,IAAA,CAAK,aAAA,EAAc;AAAA,QACvB,CAAC,CAAA;AACD,QAAA,IAAA,CAAK,MAAA,CAAO,YAAY,GAAG,CAAA;AAAA,MAC/B;AAAA,IACJ,CAAA,MAAA,IAAW,OAAO,UAAA,EAAY;AAC1B,MAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACvB,QAAA,MAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA,KAAM,IAAA,CAAK,gBAAgB,KAAK,CAAA;AAC5D,QAAA,GAAA,CAAI,gBAAA,CAAiB,SAAS,MAAM;AAChC,UAAA,IAAA,CAAK,kBAAkB,CAAC,CAAA;AACxB,UAAA,IAAA,CAAK,gBAAA,CAAiB,CAAA,EAAG,IAAA,CAAK,WAAA,CAAY,CAAC,CAAC,CAAA;AAC5C,UAAA,IAAA,CAAK,aAAA,EAAc;AAAA,QACvB,CAAC,CAAA;AACD,QAAA,IAAA,CAAK,MAAA,CAAO,YAAY,GAAG,CAAA;AAAA,MAC/B;AAAA,IACJ,CAAA,MAAO;AAEH,MAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC/C,MAAA,MAAA,CAAO,MAAA,CAAO,WAAW,KAAA,EAAO;AAAA,QAC5B,QAAA,EAAY,QAAA;AAAA,QACZ,GAAA,EAAY,GAAA;AAAA,QACZ,MAAA,EAAY,GAAA;AAAA,QACZ,OAAA,EAAY,SAAA;AAAA,QACZ,UAAA,EAAY,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,UAAA;AAAA,QAC/B,YAAA,EAAc,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAAA,OACnD,CAAA;AAED,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAClD,MAAA,WAAA,CAAY,IAAA,GAAc,MAAA;AAC1B,MAAA,WAAA,CAAY,WAAA,GAAc,yBAAA;AAC1B,MAAA,MAAA,CAAO,MAAA,CAAO,YAAY,KAAA,EAAO;AAAA,QAC7B,KAAA,EAAc,MAAA;AAAA,QACd,SAAA,EAAc,YAAA;AAAA,QACd,OAAA,EAAc,SAAA;AAAA,QACd,UAAA,EAAc,KAAK,KAAA,CAAM,UAAA;AAAA,QACzB,KAAA,EAAc,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAA;AAAA,QACjC,MAAA,EAAc,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,QAChD,YAAA,EAAc,KAAA;AAAA;AAAA;AAAA,QAGd,QAAA,EAAc,MAAA;AAAA,QACd,OAAA,EAAc;AAAA,OACjB,CAAA;AACD,MAAA,UAAA,CAAW,YAAY,WAAW,CAAA;AAClC,MAAA,IAAA,CAAK,MAAA,CAAO,YAAY,UAAU,CAAA;AAGlC,MAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAClD,MAAA,IAAA,CAAK,MAAA,CAAO,YAAY,aAAa,CAAA;AAGrC,MAAA,MAAM,MAAA,uBAAa,GAAA,EAAgD;AACnE,MAAA,KAAA,MAAW,CAAA,IAAK,KAAK,gBAAA,EAAkB;AACnC,QAAA,MAAM,GAAA,GAAM,EAAE,QAAA,IAAY,EAAA;AAC1B,QAAA,IAAI,CAAC,OAAO,GAAA,CAAI,GAAG,GAAG,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,EAAE,CAAA;AACxC,QAAA,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,CAAG,IAAA,CAAK,CAAC,CAAA;AAAA,MAC3B;AAEA,MAAA,MAAM,UAAA,GAAa,CAAC,KAAA,KAAkB;AAClC,QAAA,aAAA,CAAc,SAAA,GAAY,EAAA;AAC1B,QAAA,MAAM,CAAA,GAAI,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AAEnC,QAAA,IAAI,CAAA,EAAG;AAEH,UAAA,KAAA,MAAW,CAAA,IAAK,KAAK,gBAAA,EAAkB;AACnC,YAAA,IAAI,CAAC,CAAA,CAAE,KAAA,CAAM,WAAA,GAAc,QAAA,CAAS,CAAC,CAAA,IAAK,CAAC,EAAE,KAAA,CAAM,WAAA,EAAY,CAAE,QAAA,CAAS,CAAC,CAAA,EAAG;AAC9E,YAAA,MAAM,QAAA,GAAa,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,EAAE,KAAK,CAAA;AACpD,YAAA,MAAM,aAAa,eAAA,CAAgB,GAAA,CAAI,EAAE,KAAK,CAAA,IAAK,CAAC,IAAA,CAAK,UAAA;AACzD,YAAA,MAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,YAAA,IAAI,CAAC,UAAA,EAAY;AACb,cAAA,GAAA,CAAI,gBAAA,CAAiB,SAAS,MAAM;AAChC,gBAAA,IAAA,CAAK,cAAA,CAAe,EAAE,KAAK,CAAA;AAC3B,gBAAA,UAAA,CAAW,YAAY,KAAK,CAAA;AAAA,cAChC,CAAC,CAAA;AAAA,YACL;AACA,YAAA,aAAA,CAAc,YAAY,GAAG,CAAA;AAAA,UACjC;AAAA,QACJ,CAAA,MAAO;AAEH,UAAA,KAAA,MAAW,CAAC,GAAA,EAAK,OAAO,CAAA,IAAK,MAAA,EAAQ;AACjC,YAAA,IAAI,KAAK,aAAA,CAAc,WAAA,CAAY,IAAA,CAAK,kBAAA,CAAmB,GAAG,CAAC,CAAA;AAC/D,YAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,cAAA,MAAM,QAAA,GAAa,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,EAAE,KAAK,CAAA;AACpD,cAAA,MAAM,aAAa,eAAA,CAAgB,GAAA,CAAI,EAAE,KAAK,CAAA,IAAK,CAAC,IAAA,CAAK,UAAA;AACzD,cAAA,MAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,cAAA,IAAI,CAAC,UAAA,EAAY;AACb,gBAAA,GAAA,CAAI,gBAAA,CAAiB,SAAS,MAAM;AAChC,kBAAA,IAAA,CAAK,cAAA,CAAe,EAAE,KAAK,CAAA;AAC3B,kBAAA,UAAA,CAAW,YAAY,KAAK,CAAA;AAAA,gBAChC,CAAC,CAAA;AAAA,cACL;AACA,cAAA,aAAA,CAAc,YAAY,GAAG,CAAA;AAAA,YACjC;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ,CAAA;AAEA,MAAA,UAAA,CAAW,EAAE,CAAA;AACb,MAAA,WAAA,CAAY,iBAAiB,OAAA,EAAS,MAAM,UAAA,CAAW,WAAA,CAAY,KAAK,CAAC,CAAA;AAGzE,MAAA,qBAAA,CAAsB,MAAM,WAAA,CAAY,KAAA,CAAM,EAAE,aAAA,EAAe,IAAA,EAAM,CAAC,CAAA;AAAA,IAC1E;AAAA,EACJ;AAAA,EAEQ,mBAAmB,KAAA,EAA+B;AACtD,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,IAAA,MAAA,CAAO,MAAA,CAAO,OAAO,KAAA,EAAO;AAAA,MACxB,OAAA,EAAe,cAAA;AAAA,MACf,QAAA,EAAe,KAAK,GAAA,CAAI,sBAAA;AAAA,MACxB,UAAA,EAAe,KAAA;AAAA,MACf,aAAA,EAAe,KAAK,GAAA,CAAI,2BAAA;AAAA,MACxB,KAAA,EAAe,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,mBAAA;AAAA,MACjC,aAAA,EAAe,WAAA;AAAA,MACf,OAAA,EAAe,MAAA;AAAA,MACf,SAAA,EAAe;AAAA,KAClB,CAAA;AACD,IAAA,MAAA,CAAO,WAAA,GAAc,KAAA;AACrB,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEQ,OAAA,CACJ,KAAA,EACA,MAAA,EACA,QAAA,EACA,QAAA,EACiB;AACjB,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,QAAA;AAC9B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,QAAA;AAE/B,IAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,MACrB,KAAA,EAAY,MAAA;AAAA,MACZ,OAAA,EAAY,UAAA;AAAA,MACZ,UAAA,EAAY,SAAS,QAAA,GAAW,aAAA;AAAA,MAChC,MAAA,EAAY,MAAA;AAAA,MACZ,YAAY,MAAA,GACM,CAAA,UAAA,EAAa,KAAK,KAAA,CAAM,EAAA,CAAG,MAAM,CAAA,CAAA,GACjC,uBAAA;AAAA,MAClB,KAAA,EAAY,QAAA,GACM,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,YAAA,GACd,MAAA,GACI,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,UAAA,GACd,IAAA,CAAK,MAAM,MAAA,CAAO,cAAA;AAAA,MACxC,QAAA,EAAY,KAAK,GAAA,CAAI,iBAAA;AAAA,MACrB,UAAA,EAAY,KAAK,GAAA,CAAI,mBAAA;AAAA,MACrB,SAAA,EAAY,MAAA;AAAA,MACZ,MAAA,EAAY,WAAW,aAAA,GAAgB,SAAA;AAAA,MACvC,OAAA,EAAY,MAAA;AAAA,MACZ,UAAA,EAAY,QAAA;AAAA,MACZ,GAAA,EAAY,KAAA;AAAA,MACZ,SAAA,EAAY,YAAA;AAAA,MACZ,OAAA,EAAY,WAAW,MAAA,GAAS,GAAA;AAAA,MAChC,UAAA,EAAY;AAAA,KACf,CAAA;AAED,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,MAAA,EAAQ;AACtB,MAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACrC,QAAA,GAAA,CAAI,MAAM,UAAA,GAAa,OAAA;AAAA,MAC3B,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACrC,QAAA,GAAA,CAAI,MAAM,UAAA,GAAa,aAAA;AAAA,MAC3B,CAAC,CAAA;AAAA,IACL;AAEA,IAAA,IAAI,QAAA,EAAU;AACV,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC9C,MAAA,MAAA,CAAO,MAAA,CAAO,SAAS,KAAA,EAAO;AAAA,QAC1B,OAAA,EAAY,MAAA;AAAA,QACZ,UAAA,EAAY,QAAA;AAAA,QACZ,UAAA,EAAY,GAAA;AAAA,QACZ,OAAA,EAAY,SAAS,GAAA,GAAM;AAAA,OAC9B,CAAA;AACD,MAAA,QAAA,CAAS,SAAA,GAAY,QAAA;AAErB,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,MAAA,IAAI,GAAA,EAAK;AACL,QAAA,GAAA,CAAI,YAAA,CAAa,SAAS,IAAI,CAAA;AAC9B,QAAA,GAAA,CAAI,YAAA,CAAa,UAAU,IAAI,CAAA;AAAA,MACnC;AACA,MAAA,GAAA,CAAI,YAAY,QAAQ,CAAA;AAAA,IAC5B;AAEA,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC9C,IAAA,QAAA,CAAS,MAAM,IAAA,GAAO,GAAA;AACtB,IAAA,QAAA,CAAS,WAAA,GAAc,KAAA;AACvB,IAAA,GAAA,CAAI,YAAY,QAAQ,CAAA;AAExB,IAAA,IAAI,MAAA,EAAQ;AACR,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC3C,MAAA,MAAA,CAAO,MAAA,CAAO,MAAM,KAAA,EAAO;AAAA,QACvB,KAAA,EAAY,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,MAAA;AAAA,QAC1B,QAAA,EAAY,KAAK,GAAA,CAAI,mBAAA;AAAA,QACrB,UAAA,EAAY;AAAA,OACf,CAAA;AACD,MAAA,KAAA,CAAM,SAAA,GAAY,cAAA;AAClB,MAAA,GAAA,CAAI,YAAY,KAAK,CAAA;AAAA,IACzB;AAEA,IAAA,OAAO,GAAA;AAAA,EACX;AAAA;AAAA,EAGA,aAAA,GAAsB;AAClB,IAAA,MAAM,OAAA,GAAU,KAAK,YAAA,KAAiB,IAAA;AACtC,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,OAAA,GAAU,MAAA;AAC5B,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,oBAAA,CAAqB,IAAA,CAAK,SAAA,EAAe,IAAA,CAAK,OAAO,KAAK,CAAA;AAC/D,IAAA,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,KAAA,EAAiB,IAAA,CAAK,OAAO,KAAK,CAAA;AAC/D,IAAA,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,MAAA,EAAiB,IAAA,CAAK,OAAO,KAAK,CAAA;AAC/D,IAAA,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,eAAA,EAAiB,IAAA,CAAK,OAAO,KAAK,CAAA;AAC/D,IAAA,IAAI,OAAA,OAAc,gBAAA,IAAmB;AAAA,EACzC;AAAA;AAAA,EAGA,IAAI,eAAA,GAA2B;AAC3B,IAAA,OAAO,KAAK,YAAA,KAAiB,IAAA;AAAA,EACjC;AAAA,EAEQ,iBAAA,GAA0B;AAC9B,IAAA,MAAM,KAAA,GAAQ,KAAK,gBAAA,CAAiB,IAAA;AACpC,IAAA,IAAA,CAAK,MAAA,CAAO,WAAA,GAAc,KAAA,GAAQ,CAAA,GAC5B,KAAK,MAAA,CAAO,mBAAA,CAAoB,OAAA,CAAQ,SAAA,EAAW,MAAA,CAAO,KAAK,CAAC,CAAA,GAChE,KAAK,MAAA,CAAO,aAAA;AAAA,EACtB;AAAA;AAAA,EAIQ,YAAY,GAAA,EAA8B;AAC9C,IAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACrC,MAAA,IAAI,GAAA,CAAI,QAAQ,MAAA,KAAW,MAAA,MAAY,KAAA,CAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,QAAA;AAAA,IAC5E,CAAC,CAAA;AACD,IAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACrC,MAAA,IAAI,IAAI,OAAA,CAAQ,MAAA,KAAW,MAAA,EAAQ,GAAA,CAAI,MAAM,UAAA,GAAa,aAAA;AAAA,IAC9D,CAAC,CAAA;AAAA,EACL;AAAA,EAEQ,eAAe,KAAA,EAAyB;AAC5C,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO;AAAA,MACzB,OAAA,EAAc,MAAA;AAAA,MACd,UAAA,EAAc,QAAA;AAAA,MACd,GAAA,EAAc,KAAA;AAAA,MACd,MAAA,EAAc,KAAK,GAAA,CAAI,MAAA;AAAA,MACvB,OAAA,EAAc,QAAA;AAAA,MACd,YAAc,KAAA,CAAM,UAAA;AAAA,MACpB,YAAA,EAAc,CAAA,UAAA,EAAa,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MAC3C,SAAA,EAAc,YAAA;AAAA,MACd,UAAA,EAAc;AAAA,KACjB,CAAA;AAAA,EACL;AAAA,EAEQ,WAAA,CAAY,KAAA,EAAe,KAAA,EAAmB,MAAA,EAAoC;AACtF,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,IAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,IAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,EAAK,KAAA,EAAO,MAAM,CAAA;AAC1C,IAAA,OAAO,GAAA;AAAA,EACX;AAAA,EAEQ,kBAAA,CAAmB,GAAA,EAAwB,KAAA,EAAmB,MAAA,EAAuB;AACzF,IAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,GAAS,MAAA,CAAO,MAAM,CAAA;AAClC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,MACrB,UAAA,EAAc,MAAA,GAAS,KAAA,CAAM,EAAA,CAAG,QAAA,GAAW,aAAA;AAAA,MAC3C,OAAc,MAAA,GAAS,KAAA,CAAM,EAAA,CAAG,UAAA,GAAa,MAAM,MAAA,CAAO,QAAA;AAAA,MAC1D,QAAc,CAAA,UAAA,EAAa,MAAA,GAAS,MAAM,EAAA,CAAG,MAAA,GAAS,MAAM,UAAU,CAAA,CAAA;AAAA,MACtE,YAAA,EAAc,KAAA;AAAA,MACd,OAAA,EAAc,SAAA;AAAA,MACd,MAAA,EAAc,MAAA;AAAA,MACd,QAAA,EAAc,KAAK,GAAA,CAAI,eAAA;AAAA,MACvB,UAAA,EAAc,KAAK,GAAA,CAAI,iBAAA;AAAA,MACvB,MAAA,EAAc,SAAA;AAAA,MACd,OAAA,EAAc,MAAA;AAAA,MACd,UAAA,EAAc,QAAA;AAAA,MACd,UAAA,EAAc;AAAA,KACjB,CAAA;AAAA,EACL;AAAA,EAEQ,sBAAA,CAAuB,GAAA,EAAwB,KAAA,EAAmB,MAAA,EAAuB;AAC7F,IAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,GAAS,MAAA,CAAO,MAAM,CAAA;AAClC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,MACrB,UAAA,EAAc,MAAA,GAAS,KAAA,CAAM,SAAA,CAAU,WAAA,GAAgB,aAAA;AAAA,MACvD,OAAc,MAAA,GAAS,KAAA,CAAM,SAAA,CAAU,aAAA,GAAiB,MAAM,SAAA,CAAU,QAAA;AAAA,MACxE,QAAc,CAAA,UAAA,EAAa,MAAA,GAAS,KAAA,CAAM,SAAA,CAAU,kBAAkB,aAAa,CAAA,CAAA;AAAA,MACnF,YAAA,EAAc,KAAA;AAAA,MACd,OAAA,EAAc,SAAA;AAAA,MACd,QAAA,EAAc,KAAK,GAAA,CAAI,eAAA;AAAA,MACvB,UAAA,EAAc,KAAK,GAAA,CAAI,iBAAA;AAAA,MACvB,MAAA,EAAc,SAAA;AAAA,MACd,OAAA,EAAc,MAAA;AAAA,MACd,UAAA,EAAc,+BAAA;AAAA,MACd,UAAA,EAAc;AAAA,KACjB,CAAA;AAAA,EACL;AAAA,EAEQ,kBAAA,CAAmB,GAAA,EAAwB,KAAA,EAAmB,MAAA,EAAuB;AACzF,IAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,GAAS,MAAA,CAAO,MAAM,CAAA;AAClC,IAAA,MAAM,OAAO,IAAA,CAAK,cAAA,GAAiB,KAAK,GAAA,CAAI,iBAAA,GAAoB,KAAK,GAAA,CAAI,WAAA;AACzE,IAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,MACrB,UAAA,EAAgB,MAAA,GAAS,KAAA,CAAM,EAAA,CAAG,QAAA,GAAW,aAAA;AAAA,MAC7C,OAAgB,MAAA,GAAS,KAAA,CAAM,EAAA,CAAG,UAAA,GAAa,MAAM,MAAA,CAAO,QAAA;AAAA,MAC5D,QAAgB,CAAA,UAAA,EAAa,MAAA,GAAS,MAAM,EAAA,CAAG,MAAA,GAAS,MAAM,UAAU,CAAA,CAAA;AAAA,MACxE,YAAA,EAAgB,KAAA;AAAA,MAChB,KAAA,EAAgB,IAAA;AAAA,MAChB,MAAA,EAAgB,IAAA;AAAA,MAChB,MAAA,EAAgB,SAAA;AAAA,MAChB,OAAA,EAAgB,MAAA;AAAA,MAChB,OAAA,EAAgB,MAAA;AAAA,MAChB,UAAA,EAAgB,QAAA;AAAA,MAChB,cAAA,EAAgB,QAAA;AAAA,MAChB,OAAA,EAAgB,GAAA;AAAA,MAChB,UAAA,EAAgB,GAAA;AAAA,MAChB,UAAA,EAAgB;AAAA,KACnB,CAAA;AAAA,EACL;AAAA,EAEQ,SAAA,CAAU,KAA+B,IAAA,EAAoB;AACjE,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACnC,IAAA,IAAI,GAAA,EAAK;AACL,MAAA,GAAA,CAAI,YAAA,CAAa,OAAA,EAAS,MAAA,CAAO,IAAI,CAAC,CAAA;AACtC,MAAA,GAAA,CAAI,YAAA,CAAa,QAAA,EAAU,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,IAC3C;AAAA,EACJ;AAAA,EAEQ,WAAW,GAAA,EAAuC;AACtD,IAAA,IAAI,CAAC,KAAK,OAAO,CAAA;AACjB,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACnC,IAAA,IAAI,CAAC,KAAK,OAAO,CAAA;AACjB,IAAA,OAAO,SAAS,GAAA,CAAI,YAAA,CAAa,OAAO,CAAA,IAAK,KAAK,EAAE,CAAA;AAAA,EACxD;AACJ,CAAA;;;ACr1BO,IAAM,sBAAA,GAAsD;AAAA,EAC/D,IAAA,EAAM,IAAA;AAAA,EACN,IAAA,EAAM,KAAA;AAAA,EACN,IAAA,EAAM,KAAA;AAAA,EACN,IAAA,EAAM,KAAA;AAAA,EACN,IAAA,EAAM,IAAA;AAAA,EACN,IAAA,EAAM,IAAA;AAAA,EACN,IAAA,EAAM,IAAA;AAAA,EACN,GAAA,EAAK;AACT,CAAA;AAEA,IAAMC,UAAAA,GAAwB,CAAC,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,KAAK,CAAA;AAEvE,IAAM,YAAN,MAAgB;AAAA,EASnB,WAAA,CACY,kBACR,eAAA,EACA,KAAA,EACA,WACA,GAAA,GAAyB,yBAAA,EACzB,MAAA,GAA0B,cAAA,CAAe,SAAA,EAC3C;AANU,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AARZ,IAAA,IAAA,CAAQ,OAAA,uBAAc,GAAA,EAAiC;AAenD,IAAA,IAAA,CAAK,cAAA,GAAiB,eAAA;AACtB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,GAAA,GAAM,EAAE,GAAG,sBAAA,EAAwB,GAAG,SAAA,EAAU;AAErD,IAAA,IAAA,CAAK,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACtC,IAAA,IAAA,CAAK,eAAe,KAAK,CAAA;AAEzB,IAAA,KAAA,MAAW,KAAKA,UAAAA,EAAW;AACvB,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,MAAA,GAAA,CAAI,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,IAAK,CAAA;AAC9C,MAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,EAAK,KAAA,EAAO,CAAA,KAAM,eAAe,CAAA;AACxD,MAAA,GAAA,CAAI,gBAAA,CAAiB,SAAS,MAAM;AAChC,QAAA,IAAA,CAAK,UAAU,CAAC,CAAA;AAChB,QAAA,IAAA,CAAK,gBAAA,CAAiB,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AAAA,MACxC,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,GAAG,CAAA;AACvB,MAAA,IAAA,CAAK,EAAA,CAAG,YAAY,GAAG,CAAA;AAAA,IAC3B;AAAA,EACJ;AAAA,EAEA,SAAS,KAAA,EAAyB;AAC9B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,eAAe,KAAK,CAAA;AACzB,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,GAAG,CAAA,IAAK,KAAK,OAAA,EAAS;AACjC,MAAA,IAAA,CAAK,iBAAA;AAAA,QACD,GAAA;AAAA,QACA,KAAA;AAAA,QACA,IAAA,CAAK,cAAA,KAAmB,IAAA,IAAQ,CAAA,KAAM,IAAA,CAAK;AAAA,OAC/C;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,UAAU,CAAA,EAAsC;AAC5C,IAAA,IAAI,IAAA,CAAK,cAAA,MAAoB,CAAA,IAAK,IAAA,CAAA,EAAO;AACzC,IAAA,IAAI,KAAK,cAAA,EAAgB;AACrB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,KAAK,cAAc,CAAA;AACjD,MAAA,IAAI,MAAM,IAAA,CAAK,iBAAA,CAAkB,IAAA,EAAM,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,IAC5D;AACA,IAAA,IAAA,CAAK,iBAAiB,CAAA,IAAK,IAAA;AAC3B,IAAA,IAAI,CAAA,EAAG;AACH,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA;AAC/B,MAAA,IAAI,MAAM,IAAA,CAAK,iBAAA,CAAkB,IAAA,EAAM,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,IAC3D;AAAA,EACJ;AAAA;AAAA,EAIQ,eAAe,KAAA,EAAyB;AAC5C,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO;AAAA,MACzB,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,cAAA,EAAgB,UAAA;AAAA,MAChB,GAAA,EAAK,KAAA;AAAA,MACL,MAAA,EAAQ,KAAK,GAAA,CAAI,MAAA;AAAA,MACjB,OAAA,EAAS,QAAA;AAAA,MACT,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,SAAA,EAAW,CAAA,UAAA,EAAa,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MACxC,SAAA,EAAW,YAAA;AAAA,MACX,UAAA,EAAY;AAAA,KACf,CAAA;AAAA,EACL;AAAA,EAEQ,iBAAA,CAAkB,GAAA,EAAwB,KAAA,EAAmB,MAAA,EAAuB;AACxF,IAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,MACrB,UAAA,EAAY,MAAA,GAAS,KAAA,CAAM,SAAA,CAAU,WAAA,GAAc,aAAA;AAAA,MACnD,OAAO,MAAA,GAAS,KAAA,CAAM,SAAA,CAAU,aAAA,GAAgB,MAAM,SAAA,CAAU,QAAA;AAAA,MAChE,QAAQ,CAAA,UAAA,EAAa,MAAA,GAAS,KAAA,CAAM,SAAA,CAAU,kBAAkB,aAAa,CAAA,CAAA;AAAA,MAC7E,YAAA,EAAc,KAAA;AAAA,MACd,OAAA,EAAS,SAAA;AAAA,MACT,QAAA,EAAU,KAAK,GAAA,CAAI,WAAA;AAAA,MACnB,UAAA,EAAY,KAAK,GAAA,CAAI,aAAA;AAAA,MACrB,MAAA,EAAQ,SAAA;AAAA,MACR,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY;AAAA,KACf,CAAA;AAAA,EACL;AACJ,CAAA;;;ACzGA,IAAM,WAAA,GAA+C;AAAA;AAAA,EAEjD,eAAA,EAAmB,gBAAA;AAAA,EACnB,aAAA,EAAmB,cAAA;AAAA,EACnB,UAAA,EAAmB,WAAA;AAAA,EACnB,WAAA,EAAmB,YAAA;AAAA,EACnB,UAAA,EAAmB,WAAA;AAAA,EACnB,gBAAA,EAAmB,iBAAA;AAAA,EACnB,gBAAA,EAAmB,iBAAA;AAAA,EACnB,YAAA,EAAmB,aAAA;AAAA;AAAA,EAEnB,eAAA,EAAmB,gBAAA;AAAA,EACnB,aAAA,EAAmB,cAAA;AAAA,EACnB,WAAA,EAAmB,YAAA;AAAA,EACnB,YAAA,EAAmB,aAAA;AAAA,EACnB,WAAA,EAAmB,YAAA;AAAA,EACnB,UAAA,EAAmB,WAAA;AAAA,EACnB,OAAA,EAAmB,QAAA;AAAA,EACnB,QAAA,EAAmB,SAAA;AAAA,EACnB,WAAA,EAAmB,YAAA;AAAA,EACnB,QAAA,EAAmB,SAAA;AAAA;AAAA,EAEnB,SAAA,EAAmB,WAAA;AAAA,EACnB,iBAAA,EAAmB,kBAAA;AAAA,EACnB,OAAA,EAAmB,SAAA;AAAA,EACnB,QAAA,EAAmB,UAAA;AAAA,EACnB,MAAA,EAAmB,QAAA;AAAA,EACnB,GAAA,EAAmB,KAAA;AAAA,EACnB,QAAA,EAAmB,UAAA;AAAA,EACnB,IAAA,EAAmB,MAAA;AAAA;AAAA,EAEnB,WAAA,EAAmB,YAAA;AAAA,EACnB,UAAA,EAAmB,WAAA;AAAA,EACnB,gBAAA,EAAmB,gBAAA;AAAA,EACnB,KAAA,EAAmB,OAAA;AAAA;AAAA,EAEnB,SAAA,EAAmB,WAAA;AAAA,EACnB,gBAAA,EAAmB,iBAAA;AAAA,EACnB,eAAA,EAAmB,gBAAA;AAAA,EACnB,gBAAA,EAAmB,iBAAA;AAAA;AAAA,EAEnB,cAAA,EAAmB,cAAA;AAAA,EACnB,WAAA,EAAmB,YAAA;AAAA,EACnB,cAAA,EAAmB,eAAA;AAAA,EACnB,gBAAA,EAAmB,iBAAA;AAAA;AAAA,EAEnB,IAAA,EAAmB,MAAA;AAAA,EACnB,OAAA,EAAmB,SAAA;AAAA,EACnB,WAAA,EAAmB,YAAA;AAAA,EACnB,YAAA,EAAmB,aAAA;AAAA,EACnB,IAAA,EAAmB,MAAA;AAAA,EACnB,UAAA,EAAmB,WAAA;AAAA,EACnB,aAAA,EAAmB,cAAA;AAAA,EACnB,QAAA,EAAmB,SAAA;AAAA,EACnB,UAAA,EAAmB,WAAA;AAAA;AAAA,EAEnB,cAAA,EAAmB,eAAA;AAAA,EACnB,gBAAA,EAAmB,iBAAA;AAAA,EACnB,YAAA,EAAmB,aAAA;AAAA,EACnB,YAAA,EAAmB,aAAA;AAAA,EACnB,cAAA,EAAmB,eAAA;AAAA,EACnB,iBAAA,EAAmB,kBAAA;AAAA,EACnB,WAAA,EAAmB,YAAA;AAAA,EACnB,eAAA,EAAmB,gBAAA;AAAA,EACnB,YAAA,EAAmB,aAAA;AAAA,EACnB,aAAA,EAAmB,cAAA;AAAA;AAAA,EAEnB,eAAA,EAAqB,gBAAA;AAAA,EACrB,kBAAA,EAAqB,mBAAA;AAAA,EACrB,gBAAA,EAAqB,iBAAA;AAAA,EACrB,mBAAA,EAAqB,oBAAA;AAAA,EACrB,WAAA,EAAqB,YAAA;AAAA;AAAA,EAErB,KAAA,EAAmB,OAAA;AAAA,EACnB,WAAA,EAAmB,aAAA;AAAA;AAAA,EAEnB,UAAA,EAAmB,WAAA;AAAA,EACnB,UAAA,EAAmB,YAAA;AAAA,EACnB,SAAA,EAAmB,UAAA;AAAA,EACnB,YAAA,EAAmB,aAAA;AAAA,EACnB,WAAA,EAAmB,YAAA;AAAA;AAAA,EAEnB,cAAA,EAAmB,eAAA;AAAA,EACnB,gBAAA,EAAmB;AACvB,CAAA;AAKA,IAAM,UAAA,GAAyB;AAAA,EAC3B;AAAA,IACI,EAAA,EAAI,aAAA;AAAA,IAAe,IAAA,EAAM,wBAAA;AAAA,IAA0B,IAAA,EAAM,QAAA;AAAA,IACzD,KAAA,EAAO;AAAA,MACH,EAAE,IAAI,YAAA,EAAoB,IAAA,EAAM,cAA2B,IAAA,EAAM,QAAA,EAAK,UAAU,OAAA,EAAQ;AAAA,MACxF,EAAE,EAAA,EAAI,aAAA,EAAoB,IAAA,EAAM,aAAA,EAA2B,MAAM,QAAA,EAAI;AAAA,MACrE,EAAE,IAAI,iBAAA,EAAoB,IAAA,EAAM,mBAA2B,IAAA,EAAM,QAAA,EAAK,UAAU,OAAA,EAAQ;AAAA,MACxF,EAAE,IAAI,eAAA,EAAoB,IAAA,EAAM,iBAA2B,IAAA,EAAM,QAAA,EAAK,UAAU,OAAA,EAAQ;AAAA,MACxF,EAAE,EAAA,EAAI,YAAA,EAAoB,IAAA,EAAM,YAAA,EAA2B,MAAM,QAAA,EAAI;AAAA,MACrE,EAAE,EAAA,EAAI,kBAAA,EAAoB,IAAA,EAAM,kBAAA,EAA2B,MAAM,QAAA,EAAI;AAAA,MACrE,EAAE,EAAA,EAAI,kBAAA,EAAoB,IAAA,EAAM,kBAAA,EAA2B,MAAM,QAAA,EAAI;AAAA,MACrE,EAAE,EAAA,EAAI,cAAA,EAAoB,IAAA,EAAM,yBAAA,EAA2B,MAAM,QAAA;AAAI;AACzE,GACJ;AAAA,EACA;AAAA,IACI,EAAA,EAAI,gBAAA;AAAA,IAAkB,IAAA,EAAM,wBAAA;AAAA,IAA0B,IAAA,EAAM,QAAA;AAAA,IAC5D,KAAA,EAAO;AAAA,MACH,EAAE,IAAI,iBAAA,EAAmB,IAAA,EAAM,yBAAiC,IAAA,EAAM,QAAA,EAAK,UAAU,OAAA,EAAQ;AAAA,MAC7F,EAAE,EAAA,EAAI,eAAA,EAAmB,IAAA,EAAM,qBAAA,EAAkC,MAAM,QAAA,EAAI;AAAA,MAC3E,EAAE,EAAA,EAAI,aAAA,EAAmB,IAAA,EAAM,mBAAA,EAAkC,MAAM,QAAA,EAAI;AAAA,MAC3E,EAAE,EAAA,EAAI,cAAA,EAAmB,IAAA,EAAM,oBAAA,EAAkC,MAAM,QAAA,EAAI;AAAA,MAC3E,EAAE,EAAA,EAAI,aAAA,EAAmB,IAAA,EAAM,mBAAA,EAAkC,MAAM,QAAA,EAAI;AAAA,MAC3E,EAAE,EAAA,EAAI,YAAA,EAAmB,IAAA,EAAM,kBAAA,EAAkC,MAAM,GAAA,EAAI;AAAA,MAC3E,EAAE,EAAA,EAAI,SAAA,EAAmB,IAAA,EAAM,gCAAA,EAAkC,MAAM,QAAA,EAAI;AAAA,MAC3E,EAAE,EAAA,EAAI,UAAA,EAAmB,IAAA,EAAM,UAAA,EAAkC,MAAM,QAAA,EAAI;AAAA,MAC3E,EAAE,EAAA,EAAI,aAAA,EAAmB,IAAA,EAAM,aAAA,EAAkC,MAAM,QAAA,EAAI;AAAA,MAC3E,EAAE,EAAA,EAAI,UAAA,EAAmB,IAAA,EAAM,UAAA,EAAkC,MAAM,QAAA;AAAI;AAC/E,GACJ;AAAA,EACA;AAAA,IACI,EAAA,EAAI,kBAAA;AAAA,IAAoB,IAAA,EAAM,kBAAA;AAAA,IAAoB,IAAA,EAAM,QAAA;AAAA,IACxD,KAAA,EAAO;AAAA,MACH,EAAE,EAAA,EAAI,WAAA,EAAqB,IAAA,EAAM,WAAA,EAAqB,MAAM,QAAA,EAAI;AAAA,MAChE,EAAE,EAAA,EAAI,mBAAA,EAAqB,IAAA,EAAM,mBAAA,EAAqB,MAAM,QAAA,EAAI;AAAA,MAChE,EAAE,EAAA,EAAI,SAAA,EAAqB,IAAA,EAAM,SAAA,EAAqB,MAAM,QAAA,EAAI;AAAA,MAChE,EAAE,EAAA,EAAI,UAAA,EAAqB,IAAA,EAAM,UAAA,EAAqB,MAAM,QAAA,EAAI;AAAA,MAChE,EAAE,EAAA,EAAI,QAAA,EAAqB,IAAA,EAAM,QAAA,EAAqB,MAAM,QAAA,EAAI;AAAA,MAChE,EAAE,EAAA,EAAI,KAAA,EAAqB,IAAA,EAAM,KAAA,EAAqB,MAAM,QAAA,EAAI;AAAA,MAChE,EAAE,EAAA,EAAI,UAAA,EAAqB,IAAA,EAAM,UAAA,EAAqB,MAAM,QAAA,EAAI;AAAA,MAChE,EAAE,EAAA,EAAI,MAAA,EAAqB,IAAA,EAAM,MAAA,EAAqB,MAAM,QAAA;AAAI;AACpE,GACJ;AAAA,EACA;AAAA,IACI,EAAA,EAAI,mBAAA;AAAA,IAAqB,IAAA,EAAM,mBAAA;AAAA,IAAqB,IAAA,EAAM,QAAA;AAAA,IAC1D,KAAA,EAAO;AAAA,MACH,EAAE,EAAA,EAAI,aAAA,EAAoB,IAAA,EAAM,aAAA,EAAsB,MAAM,QAAA,EAAI;AAAA,MAChE,EAAE,EAAA,EAAI,YAAA,EAAoB,IAAA,EAAM,YAAA,EAAsB,MAAM,QAAA,EAAI;AAAA,MAChE,EAAE,EAAA,EAAI,kBAAA,EAAoB,IAAA,EAAM,oBAAA,EAAsB,MAAM,QAAA,EAAI;AAAA,MAChE,EAAE,EAAA,EAAI,OAAA,EAAoB,IAAA,EAAM,OAAA,EAAsB,MAAM,QAAA;AAAI;AACpE,GACJ;AAAA,EACA;AAAA,IACI,EAAA,EAAI,iBAAA;AAAA,IAAmB,IAAA,EAAM,iBAAA;AAAA,IAAmB,IAAA,EAAM,QAAA;AAAA,IACtD,KAAA,EAAO;AAAA,MACH,EAAE,EAAA,EAAI,WAAA,EAAoB,IAAA,EAAM,WAAA,EAA6B,MAAM,QAAA,EAAI;AAAA,MACvE,EAAE,EAAA,EAAI,kBAAA,EAAoB,IAAA,EAAM,kBAAA,EAA6B,MAAM,QAAA,EAAI;AAAA,MACvE,EAAE,EAAA,EAAI,iBAAA,EAAoB,IAAA,EAAM,2BAAA,EAA6B,MAAM,QAAA,EAAI;AAAA,MACvE,EAAE,EAAA,EAAI,kBAAA,EAAoB,IAAA,EAAM,kBAAA,EAA6B,MAAM,QAAA;AAAI;AAC3E,GACJ;AAAA,EACA;AAAA,IACI,EAAA,EAAI,mBAAA;AAAA,IAAqB,IAAA,EAAM,4BAAA;AAAA,IAA8B,IAAA,EAAM,QAAA;AAAA,IACnE,KAAA,EAAO;AAAA,MACH,EAAE,EAAA,EAAI,gBAAA,EAAoB,IAAA,EAAM,4BAAA,EAA8B,MAAM,QAAA,EAAI;AAAA,MACxE,EAAE,EAAA,EAAI,aAAA,EAAoB,IAAA,EAAM,yBAAA,EAA8B,MAAM,QAAA,EAAI;AAAA,MACxE,EAAE,EAAA,EAAI,gBAAA,EAAoB,IAAA,EAAM,gBAAA,EAA8B,MAAM,QAAA,EAAI;AAAA,MACxE,EAAE,EAAA,EAAI,kBAAA,EAAoB,IAAA,EAAM,kBAAA,EAA8B,MAAM,QAAA;AAAI;AAC5E,GACJ;AAAA,EACA;AAAA,IACI,EAAA,EAAI,kBAAA;AAAA,IAAoB,IAAA,EAAM,kBAAA;AAAA,IAAoB,IAAA,EAAM,GAAA;AAAA,IACxD,KAAA,EAAO;AAAA,MACH,EAAE,EAAA,EAAI,MAAA,EAAiB,IAAA,EAAM,MAAA,EAAiB,MAAM,GAAA,EAAI;AAAA,MACxD,EAAE,EAAA,EAAI,SAAA,EAAiB,IAAA,EAAM,SAAA,EAAiB,MAAM,QAAA,EAAI;AAAA,MACxD,EAAE,EAAA,EAAI,aAAA,EAAiB,IAAA,EAAM,aAAA,EAAiB,MAAM,GAAA,EAAI;AAAA,MACxD,EAAE,EAAA,EAAI,cAAA,EAAiB,IAAA,EAAM,cAAA,EAAiB,MAAM,QAAA,EAAI;AAAA,MACxD,EAAE,EAAA,EAAI,MAAA,EAAiB,IAAA,EAAM,MAAA,EAAiB,MAAM,QAAA,EAAI;AAAA,MACxD,EAAE,EAAA,EAAI,YAAA,EAAiB,IAAA,EAAM,YAAA,EAAiB,MAAM,QAAA,EAAI;AAAA,MACxD,EAAE,EAAA,EAAI,eAAA,EAAiB,IAAA,EAAM,eAAA,EAAiB,MAAM,QAAA,EAAI;AAAA,MACxD,EAAE,EAAA,EAAI,UAAA,EAAiB,IAAA,EAAM,UAAA,EAAiB,MAAM,QAAA,EAAI;AAAA,MACxD,EAAE,EAAA,EAAI,YAAA,EAAiB,IAAA,EAAM,YAAA,EAAiB,MAAM,QAAA;AAAI;AAC5D,GACJ;AAAA,EACA;AAAA,IACI,EAAA,EAAI,qBAAA;AAAA,IAAuB,IAAA,EAAM,qBAAA;AAAA,IAAuB,IAAA,EAAM,QAAA;AAAA,IAC9D,KAAA,EAAO;AAAA,MACH,EAAE,EAAA,EAAI,gBAAA,EAAqB,IAAA,EAAM,kBAAA,EAAqB,MAAM,QAAA,EAAI;AAAA,MAChE,EAAE,EAAA,EAAI,kBAAA,EAAqB,IAAA,EAAM,kBAAA,EAAqB,MAAM,QAAA,EAAI;AAAA,MAChE,EAAE,EAAA,EAAI,cAAA,EAAqB,IAAA,EAAM,kBAAA,EAAqB,MAAM,QAAA,EAAI;AAAA,MAChE,EAAE,EAAA,EAAI,cAAA,EAAqB,IAAA,EAAM,cAAA,EAAqB,MAAM,QAAA,EAAI;AAAA,MAChE,EAAE,EAAA,EAAI,gBAAA,EAAqB,IAAA,EAAM,gBAAA,EAAqB,MAAM,GAAA,EAAI;AAAA,MAChE,EAAE,EAAA,EAAI,mBAAA,EAAqB,IAAA,EAAM,mBAAA,EAAqB,MAAM,QAAA,EAAI;AAAA,MAChE,EAAE,EAAA,EAAI,aAAA,EAAqB,IAAA,EAAM,aAAA,EAAqB,MAAM,QAAA,EAAI;AAAA,MAChE,EAAE,EAAA,EAAI,iBAAA,EAAqB,IAAA,EAAM,iBAAA,EAAqB,MAAM,GAAA,EAAI;AAAA,MAChE,EAAE,EAAA,EAAI,cAAA,EAAqB,IAAA,EAAM,cAAA,EAAqB,MAAM,QAAA,EAAI;AAAA,MAChE,EAAE,EAAA,EAAI,eAAA,EAAqB,IAAA,EAAM,eAAA,EAAqB,MAAM,QAAA;AAAI;AACpE,GACJ;AAAA,EACA;AAAA,IACI,EAAA,EAAI,cAAA;AAAA,IAAgB,IAAA,EAAM,oBAAA;AAAA,IAAsB,IAAA,EAAM,QAAA;AAAA,IACtD,KAAA,EAAO;AAAA,MACH,EAAE,EAAA,EAAI,iBAAA,EAAuB,IAAA,EAAM,yBAAA,EAA8B,MAAM,QAAA,EAAI;AAAA,MAC3E,EAAE,EAAA,EAAI,oBAAA,EAAuB,IAAA,EAAM,0BAAA,EAA8B,MAAM,QAAA,EAAI;AAAA,MAC3E,EAAE,EAAA,EAAI,kBAAA,EAAuB,IAAA,EAAM,uBAAA,EAA8B,MAAM,QAAA,EAAI;AAAA,MAC3E,EAAE,EAAA,EAAI,qBAAA,EAAuB,IAAA,EAAM,0BAAA,EAA8B,MAAM,QAAA,EAAI;AAAA,MAC3E,EAAE,EAAA,EAAI,aAAA,EAAuB,IAAA,EAAM,4BAAA,EAA8B,MAAM,QAAA;AAAI;AAC/E,GACJ;AAAA,EACA;AAAA,IACI,EAAA,EAAI,mBAAA;AAAA,IAAqB,IAAA,EAAM,qBAAA;AAAA,IAAuB,IAAA,EAAM,QAAA;AAAA,IAC5D,KAAA,EAAO;AAAA,MACH,EAAE,EAAA,EAAI,OAAA,EAAe,IAAA,EAAM,OAAA,EAAe,MAAM,QAAA,EAAI;AAAA,MACpD,EAAE,EAAA,EAAI,aAAA,EAAe,IAAA,EAAM,aAAA,EAAe,MAAM,QAAA;AAAI;AACxD,GACJ;AAAA,EACA;AAAA,IACI,EAAA,EAAI,gBAAA;AAAA,IAAkB,IAAA,EAAM,gBAAA;AAAA,IAAkB,IAAA,EAAM,QAAA;AAAA,IACpD,KAAA,EAAO;AAAA,MACH,EAAE,EAAA,EAAI,YAAA,EAAgB,IAAA,EAAM,YAAA,EAAgB,MAAM,QAAA,EAAI;AAAA,MACtD,EAAE,EAAA,EAAI,YAAA,EAAgB,IAAA,EAAM,YAAA,EAAgB,MAAM,QAAA,EAAI;AAAA,MACtD,EAAE,EAAA,EAAI,WAAA,EAAgB,IAAA,EAAM,WAAA,EAAgB,MAAM,QAAA,EAAI;AAAA,MACtD,EAAE,EAAA,EAAI,cAAA,EAAgB,IAAA,EAAM,cAAA,EAAgB,MAAM,QAAA,EAAI;AAAA,MACtD,EAAE,EAAA,EAAI,aAAA,EAAgB,IAAA,EAAM,aAAA,EAAgB,MAAM,QAAA;AAAI;AAC1D,GACJ;AAAA,EACA;AAAA,IACI,EAAA,EAAI,mBAAA;AAAA,IAAqB,IAAA,EAAM,wBAAA;AAAA,IAA0B,IAAA,EAAM,QAAA;AAAA,IAC/D,KAAA,EAAO;AAAA,MACH,EAAE,EAAA,EAAI,gBAAA,EAAoB,IAAA,EAAM,sBAAA,EAAwB,MAAM,QAAA,EAAI;AAAA,MAClE,EAAE,EAAA,EAAI,kBAAA,EAAoB,IAAA,EAAM,kBAAA,EAAwB,MAAM,QAAA;AAAI;AACtE;AAER,CAAA;AAEA,IAAM,OAAA,GAAU;AAAA,EACZ,EAAE,EAAA,EAAI,MAAA,EAAqB,IAAA,EAAM,QAAA,EAAK,OAAO,eAAA,EAAwB;AAAA,EACrE,EAAE,EAAA,EAAI,MAAA,EAAqB,IAAA,EAAM,QAAA,EAAK,OAAO,eAAA,EAAwB;AAAA,EACrE,EAAE,EAAA,EAAI,iBAAA,EAAqB,IAAA,EAAM,QAAA,EAAK,OAAO,uBAAA,EAAwB;AAAA,EACrE,EAAE,EAAA,EAAI,WAAA,EAAqB,IAAA,EAAM,QAAA,EAAK,OAAO,WAAA,EAAwB;AAAA,EACrE,EAAE,EAAA,EAAI,mBAAA,EAAqB,IAAA,EAAM,QAAA,EAAK,OAAO,UAAA,EAAwB;AAAA,EACrE,EAAE,EAAA,EAAI,aAAA,EAAqB,IAAA,EAAM,QAAA,EAAK,OAAO,UAAA;AACjD,CAAA;AAIO,IAAM,UAAN,MAAc;AAAA,EAqBjB,WAAA,CACY,cACA,QAAA,EACA,aAAA,EACR,OACA,GAAA,GAAoC,8BAAA,EACpC,MAAA,GAAoC,cAAA,CAAe,cAAA,EACrD;AANU,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AArBZ,IAAA,IAAA,CAAQ,UAAA,GAAqC,IAAA;AAC7C,IAAA,IAAA,CAAQ,cAAA,GAAgC,IAAA;AACxC,IAAA,IAAA,CAAQ,eAAA,GAAkB,KAAA;AAI1B,IAAA,IAAA,CAAQ,UAAA,uBAAiB,GAAA,EAA+B;AAExD,IAAA,IAAA,CAAQ,cAAA,GAAiB,KAAA;AACzB,IAAA,IAAA,CAAQ,cAAA,GAAiB,KAAA;AAIzB,IAAA,IAAA,CAAQ,UAAA,GAAa,KAAA;AAGrB,IAAA,IAAA,CAAQ,eAAA,GAAkB,IAAA;AAUtB,IAAA,IAAA,CAAK,KAAA,GAAS,KAAA;AACd,IAAA,IAAA,CAAK,GAAA,GAAS,GAAA;AACd,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,EAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC1C,IAAA,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAE1C,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,IAAA,CAAK,WAAA,EAAY;AAEjB,IAAA,QAAA,CAAS,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA;AAErC,IAAA,IAAA,CAAK,eAAA,GAAkB,CAAC,CAAA,KAAkB;AACtC,MAAA,IACI,CAAC,IAAA,CAAK,EAAA,CAAG,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,IAClC,CAAC,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,EACxC;AACE,QAAA,IAAA,CAAK,WAAA,EAAY;AAAA,MACrB;AAAA,IACJ,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,IAAA,CAAK,eAAA,EAAiB,IAAI,CAAA;AAAA,EACjE;AAAA;AAAA,EAIA,SAAS,KAAA,EAAyB;AAC9B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,IAAA,CAAK,oBAAA,CAAqB,IAAA,CAAK,WAAA,EAAa,IAAI,CAAA;AAChD,IAAA,IAAA,CAAK,oBAAA,CAAqB,IAAA,CAAK,aAAA,EAAe,MAAM,CAAA;AAGpD,IAAA,IAAA,CAAK,WAAW,SAAA,GAAY,EAAA;AAG5B,IAAA,IAAA,CAAK,UAAA,CAAW,WAAA,CAAY,IAAA,CAAK,qBAAA,EAAuB,CAAA;AAExD,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,GAAG,CAAA,IAAK,KAAK,UAAA,EAAY;AACxC,MAAA,MAAM,QAAA,GAAW,KAAK,UAAA,KAAe,IAAA,IACjC,WAAW,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,EAAA,KAAO,KAAK,GAC7B,KAAA,CAAM,IAAA,CAAK,OAAK,WAAA,CAAY,CAAA,CAAE,EAAE,CAAA,KAAM,IAAA,CAAK,UAAU,CAAA,KAAM,IAAA;AACrE,MAAA,IAAA,CAAK,iBAAA,CAAkB,KAAK,QAAQ,CAAA;AAAA,IACxC;AAAA,EACJ;AAAA,EAEA,cAAc,IAAA,EAAoC;AAC9C,IAAA,IAAI,IAAA,CAAK,eAAe,IAAA,EAAM;AAC1B,MAAA,MAAM,IAAA,GAAO,UAAA,CAAW,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,WAAA,CAAY,CAAA,CAAE,EAAE,CAAA,KAAM,IAAA,CAAK,UAAU,CAAC,CAAA;AAC1F,MAAA,IAAI,IAAA,OAAW,iBAAA,CAAkB,IAAA,CAAK,WAAW,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAI,KAAK,CAAA;AAAA,IACzE;AACA,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,IAAI,SAAS,IAAA,EAAM;AACf,MAAA,MAAM,IAAA,GAAO,UAAA,CAAW,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,WAAA,CAAY,CAAA,CAAE,EAAE,CAAA,KAAM,IAAI,CAAC,CAAA;AAC/E,MAAA,IAAI,IAAA,OAAW,iBAAA,CAAkB,IAAA,CAAK,WAAW,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAI,IAAI,CAAA;AAAA,IACxE;AAAA,EACJ;AAAA,EAEA,WAAW,OAAA,EAAwB;AAC/B,IAAA,IAAA,CAAK,eAAA,GAAkB,OAAA;AACvB,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,OAAA,EAAwB;AAClC,IAAA,IAAI,IAAA,CAAK,eAAe,OAAA,EAAS;AACjC,IAAA,IAAA,CAAK,UAAA,GAAa,OAAA;AAClB,IAAA,IAAA,CAAK,WAAA,EAAY;AAGjB,IAAA,IAAA,CAAK,WAAW,SAAA,GAAY,EAAA;AAG5B,IAAA,IAAA,CAAK,UAAA,CAAW,WAAA,CAAY,IAAA,CAAK,qBAAA,EAAuB,CAAA;AAGxD,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,IAAA,MAAM,OAAA,GAAU,KAAK,QAAA,EAAS;AAC9B,IAAA,IAAA,CAAK,qBAAqB,OAAO,CAAA;AACjC,IAAA,IAAA,CAAK,SAAA,CAAU,YAAY,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,SAAA,GAAY,OAAA;AAEjB,IAAA,IAAI,IAAA,CAAK,eAAe,IAAA,EAAM;AAC1B,MAAA,MAAM,SAAA,GAAY,UAAA,CAAW,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,WAAA,CAAY,CAAA,CAAE,EAAE,CAAA,KAAM,IAAA,CAAK,UAAU,CAAC,CAAA;AAC/F,MAAA,IAAI,SAAA,EAAW;AACX,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,UAAU,EAAE,CAAA;AAC/C,QAAA,IAAI,MAAA,EAAQ,IAAA,CAAK,iBAAA,CAAkB,MAAA,EAAQ,IAAI,CAAA;AAAA,MACnD;AAAA,IACJ;AAEA,IAAA,IAAI,OAAA,EAAS;AAET,MAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO;AAAA,QACzB,QAAA,EAAU,UAAA;AAAA,QACV,IAAA,EAAU,GAAA;AAAA,QACV,GAAA,EAAU,GAAA;AAAA,QACV,MAAA,EAAU,MAAA;AAAA,QACV,MAAA,EAAU;AAAA,OACb,CAAA;AACD,MAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AAAA,IAC3B,CAAA,MAAO;AAEH,MAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO;AAAA,QACzB,QAAA,EAAU,EAAA;AAAA,QACV,IAAA,EAAU,EAAA;AAAA,QACV,GAAA,EAAU,EAAA;AAAA,QACV,MAAA,EAAU,EAAA;AAAA,QACV,MAAA,EAAU;AAAA,OACb,CAAA;AACD,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,IAC3B;AAGA,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,IAAA,CAAK,UAAA,EAAW;AAEhB,IAAA,qBAAA,CAAsB,MAAM,IAAA,CAAK,sBAAA,EAAwB,CAAA;AAAA,EAC7D;AAAA,EAEA,eAAe,IAAA,EAAyB;AACpC,IAAA,IAAI,KAAK,MAAA,CAAO,aAAA,KAAkB,MAAM,IAAA,CAAK,WAAA,CAAY,KAAK,MAAM,CAAA;AAAA,EACxE;AAAA,EAEA,OAAA,GAAgB;AACZ,IAAA,IAAA,CAAK,OAAO,MAAA,EAAO;AACnB,IAAA,QAAA,CAAS,mBAAA,CAAoB,OAAA,EAAS,IAAA,CAAK,eAAA,EAAiB,IAAI,CAAA;AAAA,EACpE;AAAA;AAAA,EAIA,IAAY,QAAA,GAAmB;AAC3B,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,UAAA,GAAa,CAAA,GAAI,KAAK,GAAA,CAAI,WAAA;AAAA,EAC9C;AAAA,EAEQ,cAAA,GAAuB;AAC3B,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO;AAAA,MACzB,OAAA,EAAe,MAAA;AAAA,MACf,aAAA,EAAe,QAAA;AAAA,MACf,UAAA,EAAe,GAAA;AAAA,MACf,QAAA,EAAe,UAAA;AAAA,MACf,MAAA,EAAe,MAAA;AAAA,MACf,UAAA,EAAe,KAAK,KAAA,CAAM,UAAA;AAAA,MAC1B,WAAA,EAAe,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MACjD,SAAA,EAAe,YAAA;AAAA,MACf,UAAA,EAAe,MAAA;AAAA,MACf,UAAA,EAAe,KAAK,GAAA,CAAI,qBAAA;AAAA,MACxB,QAAA,EAAe,QAAA;AAAA,MACf,UAAA,EAAe;AAAA,KAClB,CAAA;AAAA,EACL;AAAA,EAEQ,UAAA,GAAmB;AACvB,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACvB,MAAA,IAAA,CAAK,EAAA,CAAG,MAAM,KAAA,GAAQ,GAAA;AAAA,IAC1B,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,KAAK,QAAQ,CAAA,EAAA,CAAA;AAAA,IAC1C;AAAA,EACJ;AAAA,EAEQ,YAAA,GAAqB;AAEzB,IAAA,IAAA,CAAK,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO;AAAA,MACjC,YAAA,EAAc,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MAChD,OAAA,EAAc,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,OAAA,CAAA;AAAA,MACzC,SAAA,EAAc,YAAA;AAAA,MACd,UAAA,EAAc;AAAA,KACjB,CAAA;AAGD,IAAA,IAAA,CAAK,UAAA,CAAW,WAAA,CAAY,IAAA,CAAK,qBAAA,EAAuB,CAAA;AACxD,IAAA,IAAA,CAAK,EAAA,CAAG,WAAA,CAAY,IAAA,CAAK,UAAU,CAAA;AAGnC,IAAA,IAAA,CAAK,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAClD,IAAA,IAAA,CAAK,oBAAA,CAAqB,IAAA,CAAK,WAAA,EAAa,IAAI,CAAA;AAChD,IAAA,IAAA,CAAK,WAAA,CAAY,gBAAA,CAAiB,OAAA,EAAS,MAAM;AAC7C,MAAA,IAAA,CAAK,UAAU,QAAA,CAAS;AAAA,QACpB,KAAK,EAAE,IAAA,CAAK,IAAI,WAAA,GAAc,IAAA,CAAK,IAAI,MAAA,CAAA,GAAU,CAAA;AAAA,QACjD,QAAA,EAAU;AAAA,OACb,CAAA;AAAA,IACL,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,EAAA,CAAG,WAAA,CAAY,IAAA,CAAK,WAAW,CAAA;AAGpC,IAAA,IAAA,CAAK,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC7C,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO;AAAA,MAChC,IAAA,EAAiB,GAAA;AAAA,MACjB,SAAA,EAAiB,QAAA;AAAA,MACjB,OAAA,EAAiB,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,UAAU,CAAA,MAAA,CAAA;AAAA,MAC5C,SAAA,EAAiB,YAAA;AAAA,MACjB,cAAA,EAAiB,MAAA;AAAA,MACjB,eAAA,EAAiB;AAAA,KACpB,CAAA;AACD,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC/C,IAAA,QAAA,CAAS,WAAA,GAAc,4CAAA;AACvB,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,QAAQ,CAAA;AAClC,IAAA,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA;AAEvC,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,QAAA,EAAS;AAC/B,IAAA,IAAA,CAAK,oBAAA,CAAqB,KAAK,SAAS,CAAA;AACxC,IAAA,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY,IAAA,CAAK,SAAS,CAAA;AAEzC,IAAA,IAAA,CAAK,UAAU,gBAAA,CAAiB,QAAA,EAAU,MAAM,IAAA,CAAK,wBAAwB,CAAA;AAC7E,IAAA,IAAA,CAAK,EAAA,CAAG,WAAA,CAAY,IAAA,CAAK,SAAS,CAAA;AAGlC,IAAA,IAAA,CAAK,aAAA,GAAgB,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACpD,IAAA,IAAA,CAAK,oBAAA,CAAqB,IAAA,CAAK,aAAA,EAAe,MAAM,CAAA;AACpD,IAAA,IAAA,CAAK,aAAA,CAAc,gBAAA,CAAiB,OAAA,EAAS,MAAM;AAC/C,MAAA,IAAA,CAAK,UAAU,QAAA,CAAS;AAAA,QACpB,MAAM,IAAA,CAAK,GAAA,CAAI,WAAA,GAAc,IAAA,CAAK,IAAI,MAAA,IAAU,CAAA;AAAA,QAChD,QAAA,EAAU;AAAA,OACb,CAAA;AAAA,IACL,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,EAAA,CAAG,WAAA,CAAY,IAAA,CAAK,aAAa,CAAA;AAEtC,IAAA,qBAAA,CAAsB,MAAM,IAAA,CAAK,sBAAA,EAAwB,CAAA;AAAA,EAC7D;AAAA,EAEQ,qBAAA,GAA2C;AAC/C,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,IAAA,GAAA,CAAI,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,WAAA;AAChC,IAAA,GAAA,CAAI,SAAA,GAAY,iBAAA;AAChB,IAAA,IAAA,CAAK,oBAAA,CAAqB,KAAK,KAAK,CAAA;AACpC,IAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AACpB,IAAA,GAAA,CAAI,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACjC,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,IAAA,CAAK,oBAAoB,GAAG,CAAA;AAAA,IAChC,CAAC,CAAA;AACD,IAAA,OAAO,GAAA;AAAA,EACX;AAAA,EAEQ,qBAAqB,IAAA,EAA4B;AACrD,IAAA,IAAA,CAAK,WAAW,KAAA,EAAM;AACtB,IAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC1B,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,MAAA,GAAA,CAAI,KAAA,GAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,EAAE,CAAA;AACxC,MAAA,GAAA,CAAI,SAAA,GAAY,QAAA,CAAS,GAAA,CAAI,EAAE,KAAK,GAAA,CAAI,IAAA;AACxC,MAAA,IAAA,CAAK,iBAAA,CAAkB,KAAK,KAAK,CAAA;AACjC,MAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AACpB,MAAA,GAAA,CAAI,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACjC,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,IAAA,CAAK,cAAA,CAAe,KAAK,GAAG,CAAA;AAAA,MAChC,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,GAAG,CAAA;AAC/B,MAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AAAA,IACxB;AAAA,EACJ;AAAA,EAEQ,sBAAA,GAA+B;AACnC,IAAA,MAAM,EAAE,SAAA,EAAW,YAAA,EAAc,YAAA,KAAiB,IAAA,CAAK,SAAA;AACvD,IAAA,MAAM,cAAgB,SAAA,GAAY,CAAA;AAClC,IAAA,MAAM,aAAA,GAAgB,SAAA,GAAY,YAAA,GAAe,YAAA,GAAe,CAAA;AAChE,IAAA,IAAI,KAAK,UAAA,EAAY;AAEjB,MAAA,IAAA,CAAK,WAAA,CAAY,MAAM,OAAA,GAAY,MAAA;AACnC,MAAA,IAAA,CAAK,aAAA,CAAc,MAAM,OAAA,GAAU,MAAA;AACnC,MAAA,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,OAAA,GAAY,WAAA,GAAgB,KAAA,GAAQ,KAAA;AAC3D,MAAA,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,OAAA,GAAU,aAAA,GAAgB,KAAA,GAAQ,KAAA;AAAA,IAC/D,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,OAAA,GAAY,WAAA,GAAgB,MAAA,GAAS,MAAA;AAC5D,MAAA,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,OAAA,GAAU,aAAA,GAAgB,MAAA,GAAS,MAAA;AAAA,IAChE;AAAA,EACJ;AAAA,EAEQ,WAAA,GAAoB;AACxB,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO;AAAA,MAC7B,QAAA,EAAc,OAAA;AAAA,MACd,MAAA,EAAc,MAAA;AAAA,MACd,OAAA,EAAc,MAAA;AAAA,MACd,UAAA,EAAc,KAAK,KAAA,CAAM,UAAA;AAAA,MACzB,MAAA,EAAc,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MAChD,YAAA,EAAc,KAAA;AAAA,MACd,OAAA,EAAc,OAAA;AAAA,MACd,QAAA,EAAc,OAAA;AAAA,MACd,SAAA,EAAc,6BAAA;AAAA,MACd,UAAA,EAAc,KAAK,GAAA,CAAI,qBAAA;AAAA,MACvB,QAAA,EAAc,KAAK,GAAA,CAAI;AAAA,KAC1B,CAAA;AAAA,EACL;AAAA,EAEQ,QAAA,CAAS,OAAO,CAAA,EAAmB;AACvC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACtC,IAAA,MAAA,CAAO,MAAA,CAAO,EAAE,KAAA,EAAO;AAAA,MACnB,OAAA,EAAqB,MAAA;AAAA,MACrB,qBAAqB,CAAA,OAAA,EAAU,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,WAAW,CAAA,GAAA,CAAA;AAAA,MAC5D,GAAA,EAAqB,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,EAAA;AAAA,KAC1C,CAAA;AACD,IAAA,OAAO,CAAA;AAAA,EACX;AAAA,EAEQ,oBAAA,CAAqB,KAAwB,GAAA,EAA0B;AAC3E,IAAA,GAAA,CAAI,SAAA,GAAY,GAAA,KAAQ,IAAA,GAAO,eAAA,GAAkB,iBAAA;AACjD,IAAA,GAAA,CAAI,QAAc,GAAA,KAAQ,IAAA,GAAO,KAAK,MAAA,CAAO,QAAA,GAAW,KAAK,MAAA,CAAO,UAAA;AACpE,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,KAAA,CAAM,OAAA,IAAW,MAAA;AACrC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,MACrB,OAAA;AAAA,MACA,KAAA,EAAgB,MAAA;AAAA,MAChB,MAAA,EAAgB,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,eAAe,CAAA,EAAA,CAAA;AAAA,MAC3C,UAAA,EAAgB,KAAK,KAAA,CAAM,UAAA;AAAA,MAC3B,KAAA,EAAgB,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAA;AAAA,MACnC,MAAA,EAAgB,MAAA;AAAA,MAChB,cAAgB,GAAA,KAAQ,IAAA,GAAS,aAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAA,GAAK,MAAA;AAAA,MACxE,WAAgB,GAAA,KAAQ,MAAA,GAAS,aAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAA,GAAK,MAAA;AAAA,MACxE,QAAA,EAAgB,KAAK,GAAA,CAAI,iBAAA;AAAA,MACzB,MAAA,EAAgB,SAAA;AAAA,MAChB,OAAA,EAAgB,MAAA;AAAA,MAChB,UAAA,EAAgB,QAAA;AAAA,MAChB,cAAA,EAAgB,QAAA;AAAA,MAChB,UAAA,EAAgB,GAAA;AAAA,MAChB,OAAA,EAAgB;AAAA,KACnB,CAAA;AAAA,EACL;AAAA;AAAA,EAIQ,cAAA,CAAe,KAAe,SAAA,EAAoC;AACtE,IAAA,IAAI,IAAA,CAAK,cAAA,KAAmB,GAAA,CAAI,EAAA,EAAI;AAChC,MAAA,IAAA,CAAK,WAAA,EAAY;AACjB,MAAA;AAAA,IACJ;AACA,IAAA,IAAA,CAAK,iBAAiB,GAAA,CAAI,EAAA;AAE1B,IAAA,MAAM,IAAA,GAAO,UAAU,qBAAA,EAAsB;AAC7C,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO;AAAA,MAC7B,OAAA,EAAS,OAAA;AAAA,MACT,IAAA,EAAS,CAAA,EAAG,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAA,EAAA,CAAA;AAAA,MAC1B,GAAA,EAAS,CAAA,EAAG,IAAA,CAAK,GAAG,CAAA,EAAA;AAAA,KACvB,CAAA;AAED,IAAA,IAAA,CAAK,OAAO,SAAA,GAAY,EAAA;AAGxB,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,IAAA,MAAA,CAAO,MAAA,CAAO,OAAO,KAAA,EAAO;AAAA,MACxB,OAAA,EAAe,cAAA;AAAA,MACf,QAAA,EAAe,KAAK,GAAA,CAAI,qBAAA;AAAA,MACxB,UAAA,EAAe,KAAA;AAAA,MACf,aAAA,EAAe,KAAK,GAAA,CAAI,0BAAA;AAAA,MACxB,KAAA,EAAe,IAAA,CAAK,KAAA,CAAM,cAAA,CAAe,kBAAA;AAAA,MACzC,aAAA,EAAe,WAAA;AAAA,MACf,YAAA,EAAe,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MACjD,YAAA,EAAe,KAAA;AAAA,MACf,OAAA,EAAe;AAAA,KAClB,CAAA;AACD,IAAA,MAAA,CAAO,WAAA,GAAc,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,EAAE,CAAA;AACjD,IAAA,IAAA,CAAK,MAAA,CAAO,YAAY,MAAM,CAAA;AAG9B,IAAA,KAAA,MAAW,IAAA,IAAQ,IAAI,KAAA,EAAO;AAC1B,MAAA,MAAM,MAAA,GAAW,KAAK,EAAA,IAAM,WAAA;AAC5B,MAAA,MAAM,QAAA,GAAW,KAAK,UAAA,KAAe,IAAA,IAAQ,YAAY,IAAA,CAAK,EAAE,MAAM,IAAA,CAAK,UAAA;AAC3E,MAAA,MAAM,GAAA,GAAW,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAEhD,MAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,QACrB,KAAA,EAAY,MAAA;AAAA,QACZ,OAAA,EAAY,UAAA;AAAA,QACZ,UAAA,EAAY,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAG,QAAA,GAAW,aAAA;AAAA,QAChD,MAAA,EAAY,MAAA;AAAA,QACZ,YAAY,QAAA,GACM,CAAA,UAAA,EAAa,KAAK,KAAA,CAAM,EAAA,CAAG,MAAM,CAAA,CAAA,GACjC,uBAAA;AAAA,QAClB,KAAA,EAAY,QAAA,GACM,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,UAAA,GACd,MAAA,GACI,IAAA,CAAK,KAAA,CAAM,cAAA,CAAe,gBAAA,GAC1B,IAAA,CAAK,MAAM,EAAA,CAAG,YAAA;AAAA,QACpC,QAAA,EAAY,KAAK,GAAA,CAAI,mBAAA;AAAA,QACrB,UAAA,EAAY,KAAK,GAAA,CAAI,qBAAA;AAAA,QACrB,SAAA,EAAY,MAAA;AAAA,QACZ,MAAA,EAAY,SAAS,SAAA,GAAY,SAAA;AAAA,QACjC,OAAA,EAAY,MAAA;AAAA,QACZ,UAAA,EAAY,QAAA;AAAA,QACZ,GAAA,EAAY,KAAA;AAAA,QACZ,SAAA,EAAY;AAAA,OACf,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC9C,MAAA,MAAA,CAAO,MAAA,CAAO,SAAS,KAAA,EAAO;AAAA,QAC1B,KAAA,EAAY,MAAA;AAAA,QACZ,OAAA,EAAY,MAAA;AAAA,QACZ,UAAA,EAAY,QAAA;AAAA,QACZ,UAAA,EAAY;AAAA,OACf,CAAA;AACD,MAAA,QAAA,CAAS,SAAA,GAAY,UAAU,IAAA,CAAK,EAAE,KAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,IAAK,IAAA,CAAK,IAAA;AAEpE,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC9C,MAAA,QAAA,CAAS,MAAM,IAAA,GAAO,GAAA;AACtB,MAAA,QAAA,CAAS,WAAA,GAAc,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA;AAE7C,MAAA,GAAA,CAAI,YAAY,QAAQ,CAAA;AACxB,MAAA,GAAA,CAAI,YAAY,QAAQ,CAAA;AAExB,MAAA,IAAI,IAAA,CAAK,YAAY,MAAA,EAAQ;AACzB,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AACxC,QAAA,MAAA,CAAO,MAAA,CAAO,GAAG,KAAA,EAAO;AAAA,UACpB,QAAA,EAAY,KAAK,GAAA,CAAI,gBAAA;AAAA,UACrB,KAAA,EAAY,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,YAAA;AAAA,UAC1B,UAAA,EAAY;AAAA,SACf,CAAA;AACD,QAAA,EAAA,CAAG,cAAc,IAAA,CAAK,QAAA;AACtB,QAAA,GAAA,CAAI,YAAY,EAAE,CAAA;AAAA,MACtB,CAAA,MAAA,IAAW,CAAC,MAAA,EAAQ;AAChB,QAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,QAAA,MAAA,CAAO,MAAA,CAAO,KAAK,KAAA,EAAO;AAAA,UACtB,QAAA,EAAY,KAAK,GAAA,CAAI,iBAAA;AAAA,UACrB,KAAA,EAAY,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,aAAA;AAAA,UAC1B,UAAA,EAAY;AAAA,SACf,CAAA;AACD,QAAA,IAAA,CAAK,WAAA,GAAc,KAAK,MAAA,CAAO,SAAA;AAC/B,QAAA,GAAA,CAAI,YAAY,IAAI,CAAA;AAAA,MACxB;AAEA,MAAA,IAAI,MAAA,EAAQ;AACR,QAAA,IAAI,CAAC,QAAA,EAAU;AACX,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,QAAA;AAC9B,UAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AAAE,YAAA,GAAA,CAAI,MAAM,UAAA,GAAa,OAAA;AAAA,UAAS,CAAC,CAAA;AAC5E,UAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AAAE,YAAA,GAAA,CAAI,MAAM,UAAA,GAAa,aAAA;AAAA,UAAe,CAAC,CAAA;AAAA,QACtF;AACA,QAAA,GAAA,CAAI,gBAAA,CAAiB,SAAS,MAAM;AAChC,UAAA,MAAM,WAAA,GAAc,WAAA,CAAY,IAAA,CAAK,EAAE,CAAA;AACvC,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,KAAe,WAAA,GAAc,IAAA,GAAO,WAAA;AACtD,UAAA,IAAA,CAAK,cAAc,IAAI,CAAA;AACvB,UAAA,IAAA,CAAK,aAAa,IAAI,CAAA;AACtB,UAAA,IAAA,CAAK,WAAA,EAAY;AAEjB,UAAA,IAAI,IAAA,CAAK,UAAA,IAAc,IAAA,KAAS,IAAA,EAAM;AAClC,YAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,YAAA,IAAA,CAAK,UAAA,EAAW;AAChB,YAAA,IAAA,CAAK,aAAA,IAAgB;AAAA,UACzB;AAAA,QACJ,CAAC,CAAA;AAAA,MACL;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,YAAY,GAAG,CAAA;AAAA,IAC/B;AAEA,IAAA,qBAAA,CAAsB,MAAM;AACxB,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,qBAAA,EAAsB;AAClD,MAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,MAAA,CAAO,WAAA,GAAc,CAAA,EAAG;AACzC,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,GAAA,GAAM,CAAA,EAAG,OAAO,WAAA,GAAc,OAAA,CAAQ,SAAS,CAAC,CAAA,EAAA,CAAA;AAAA,MACtE;AAAA,IACJ,CAAC,CAAA;AAAA,EACL;AAAA,EAEQ,WAAA,GAAoB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,OAAA,GAAU,MAAA;AAC5B,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AAAA,EAC3B;AAAA,EAEQ,oBAAoB,SAAA,EAAoC;AAC5D,IAAA,IAAI,KAAK,eAAA,EAAiB;AACtB,MAAA,IAAA,CAAK,WAAA,EAAY;AACjB,MAAA;AAAA,IACJ;AACA,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAEvB,IAAA,IAAA,CAAK,OAAO,SAAA,GAAY,EAAA;AAGxB,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,IAAA,MAAA,CAAO,MAAA,CAAO,OAAO,KAAA,EAAO;AAAA,MACxB,OAAA,EAAe,cAAA;AAAA,MACf,QAAA,EAAe,KAAK,GAAA,CAAI,qBAAA;AAAA,MACxB,UAAA,EAAe,KAAA;AAAA,MACf,aAAA,EAAe,KAAK,GAAA,CAAI,0BAAA;AAAA,MACxB,KAAA,EAAe,IAAA,CAAK,KAAA,CAAM,cAAA,CAAe,kBAAA;AAAA,MACzC,aAAA,EAAe,WAAA;AAAA,MACf,YAAA,EAAe,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MACjD,YAAA,EAAe,KAAA;AAAA,MACf,OAAA,EAAe;AAAA,KAClB,CAAA;AACD,IAAA,MAAA,CAAO,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,WAAA;AACzC,IAAA,IAAA,CAAK,MAAA,CAAO,YAAY,MAAM,CAAA;AAE9B,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC1B,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,EAAA,KAAO,mBAAA,GAAsB,IAAA,CAAK,iBACzC,MAAA,CAAO,EAAA,KAAO,aAAA,GAAsB,IAAA,CAAK,cAAA,GACzC,KAAA;AAElB,MAAA,MAAM,cAAc,SAAA,GACb,mBAAA,CAAoB,MAAA,CAAO,EAAE,KAAK,WAAA,CAAY,MAAA,CAAO,EAAE,CAAA,IAAK,OAAO,IAAA,GACnE,WAAA,CAAY,MAAA,CAAO,EAAE,KAAK,MAAA,CAAO,IAAA;AAExC,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,EAAA,KAAO,mBAAA,GACrB,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,QAAQ,OAAA,GACzE,MAAA,CAAO,EAAA,KAAO,aAAA,GACb,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,OAAA,GAC3E,IAAA,CAAK,cAAA,CAAe,OAAO,EAAE,CAAA;AAEnC,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,MAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,QACrB,KAAA,EAAY,MAAA;AAAA,QACZ,OAAA,EAAY,UAAA;AAAA,QACZ,UAAA,EAAY,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,GAAG,QAAA,GAAW,aAAA;AAAA,QACjD,MAAA,EAAY,MAAA;AAAA,QACZ,YAAY,SAAA,GACM,CAAA,UAAA,EAAa,KAAK,KAAA,CAAM,EAAA,CAAG,MAAM,CAAA,CAAA,GACjC,uBAAA;AAAA,QAClB,KAAA,EAAY,YACM,IAAA,CAAK,KAAA,CAAM,GAAG,UAAA,GACd,IAAA,CAAK,MAAM,cAAA,CAAe,gBAAA;AAAA,QAC5C,QAAA,EAAY,KAAK,GAAA,CAAI,mBAAA;AAAA,QACrB,UAAA,EAAY,KAAK,GAAA,CAAI,qBAAA;AAAA,QACrB,SAAA,EAAY,MAAA;AAAA,QACZ,MAAA,EAAY,SAAA;AAAA,QACZ,OAAA,EAAY,MAAA;AAAA,QACZ,UAAA,EAAY,QAAA;AAAA,QACZ,GAAA,EAAY,KAAA;AAAA,QACZ,SAAA,EAAY;AAAA,OACf,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC9C,MAAA,MAAA,CAAO,MAAA,CAAO,SAAS,KAAA,EAAO;AAAA,QAC1B,KAAA,EAAY,MAAA;AAAA,QACZ,OAAA,EAAY,MAAA;AAAA,QACZ,UAAA,EAAY,QAAA;AAAA,QACZ,UAAA,EAAY;AAAA,OACf,CAAA;AACD,MAAA,QAAA,CAAS,SAAA,GAAY,WAAA;AAErB,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC9C,MAAA,QAAA,CAAS,MAAM,IAAA,GAAO,GAAA;AACtB,MAAA,QAAA,CAAS,WAAA,GAAc,KAAA;AAEvB,MAAA,GAAA,CAAI,YAAY,QAAQ,CAAA;AACxB,MAAA,GAAA,CAAI,YAAY,QAAQ,CAAA;AAExB,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,QAAA;AAC9B,MAAA,IAAI,CAAC,SAAA,EAAW;AACZ,QAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AAAE,UAAA,GAAA,CAAI,MAAM,UAAA,GAAa,OAAA;AAAA,QAAS,CAAC,CAAA;AAC5E,QAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AAAE,UAAA,GAAA,CAAI,MAAM,UAAA,GAAa,aAAA;AAAA,QAAe,CAAC,CAAA;AAAA,MACtF;AAEA,MAAA,GAAA,CAAI,gBAAA,CAAiB,SAAS,MAAM;AAChC,QAAA,IAAI,MAAA,CAAO,OAAO,mBAAA,EAAqB;AACnC,UAAA,IAAA,CAAK,cAAA,GAAiB,CAAC,IAAA,CAAK,cAAA;AAC5B,UAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,cAAA,GAAiB,UAAA,GAAa,UAAU,CAAA;AAAA,QAC/D,CAAA,MAAA,IAAW,MAAA,CAAO,EAAA,KAAO,aAAA,EAAe;AACpC,UAAA,IAAA,CAAK,cAAA,GAAiB,CAAC,IAAA,CAAK,cAAA;AAC5B,UAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,cAAA,GAAiB,UAAA,GAAa,YAAY,CAAA;AAAA,QACjE,CAAA,MAAO;AACH,UAAA,IAAA,CAAK,QAAA,CAAS,OAAO,EAAE,CAAA;AAAA,QAC3B;AACA,QAAA,IAAA,CAAK,WAAA,EAAY;AAAA,MACrB,CAAC,CAAA;AAED,MAAA,IAAA,CAAK,MAAA,CAAO,YAAY,GAAG,CAAA;AAAA,IAC/B;AAEA,IAAA,MAAM,IAAA,GAAO,UAAU,qBAAA,EAAsB;AAC7C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,EAAA,CAAG,qBAAA,EAAsB;AAC7C,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO;AAAA,MAC7B,OAAA,EAAS,OAAA;AAAA,MACT,IAAA,EAAS,CAAA,EAAG,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA,EAAA,CAAA;AAAA,MAC5B,GAAA,EAAS,CAAA,EAAG,IAAA,CAAK,GAAG,CAAA,EAAA;AAAA,KACvB,CAAA;AAED,IAAA,qBAAA,CAAsB,MAAM;AACxB,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,qBAAA,EAAsB;AAClD,MAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,MAAA,CAAO,WAAA,GAAc,CAAA,EAAG;AACzC,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,GAAA,GAAM,CAAA,EAAG,OAAO,WAAA,GAAc,OAAA,CAAQ,SAAS,CAAC,CAAA,EAAA,CAAA;AAAA,MACtE;AAAA,IACJ,CAAC,CAAA;AAAA,EACL;AAAA;AAAA,EAIQ,iBAAiB,KAAA,EAAuB;AAC5C,IAAA,MAAM,GAAA,GAAgE;AAAA,MAClE,WAAA,EAAmB,YAAA;AAAA,MACnB,cAAA,EAAmB,WAAA;AAAA,MACnB,gBAAA,EAAmB,QAAA;AAAA,MACnB,iBAAA,EAAmB,cAAA;AAAA,MACnB,eAAA,EAAmB,YAAA;AAAA,MACnB,iBAAA,EAAmB,QAAA;AAAA,MACnB,gBAAA,EAAmB,aAAA;AAAA,MACnB,mBAAA,EAAqB,UAAA;AAAA,MACrB,YAAA,EAAmB,SAAA;AAAA,MACnB,iBAAA,EAAmB,SAAA;AAAA,MACnB,cAAA,EAAmB,UAAA;AAAA,MACnB,iBAAA,EAAmB;AAAA,KACvB;AACA,IAAA,MAAM,GAAA,GAAM,IAAI,KAAK,CAAA;AACrB,IAAA,OAAO,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA;AAAA,EAC/C;AAAA,EAEQ,aAAa,IAAA,EAAoB;AACrC,IAAA,MAAM,WAAA,GAAc,WAAA,CAAY,IAAA,CAAK,EAAE,CAAA;AACvC,IAAA,IAAI,WAAA,IAAe,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA,EAAG;AAC/C,MAAA,OAAO,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA;AAAA,IACxC;AACA,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EAChB;AAAA,EAEQ,eAAe,QAAA,EAA0B;AAC7C,IAAA,MAAM,GAAA,GAA6D;AAAA,MAC/D,IAAA,EAAmB,MAAA;AAAA,MACnB,IAAA,EAAmB,MAAA;AAAA,MACnB,eAAA,EAAmB,gBAAA;AAAA,MACnB,SAAA,EAAmB,UAAA;AAAA,MACnB,iBAAA,EAAmB,SAAA;AAAA,MACnB,WAAA,EAAmB;AAAA,KACvB;AACA,IAAA,MAAM,GAAA,GAAM,IAAI,QAAQ,CAAA;AACxB,IAAA,OAAO,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,GAAI,QAAA;AAAA,EAC5C;AAAA;AAAA,EAIQ,YAAY,GAAA,EAA8B;AAC9C,IAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACrC,MAAA,IAAI,GAAA,CAAI,QAAQ,MAAA,KAAW,MAAA,MAAY,KAAA,CAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,QAAA;AAAA,IAC5E,CAAC,CAAA;AACD,IAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACrC,MAAA,IAAI,IAAI,OAAA,CAAQ,MAAA,KAAW,MAAA,EAAQ,GAAA,CAAI,MAAM,UAAA,GAAa,aAAA;AAAA,IAC9D,CAAC,CAAA;AAAA,EACL;AAAA,EAEQ,iBAAA,CAAkB,KAAwB,MAAA,EAAuB;AACrE,IAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,GAAS,MAAA,CAAO,MAAM,CAAA;AAClC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,MACrB,KAAA,EAAgB,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA,EAAA,CAAA;AAAA,MACvC,MAAA,EAAgB,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA,EAAA,CAAA;AAAA,MACvC,UAAA,EAAgB,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,cAAA,GAAiB,aAAA;AAAA,MACxD,KAAA,EAAgB,SACM,IAAA,CAAK,KAAA,CAAM,eAAe,eAAA,GAC1B,IAAA,CAAK,MAAM,cAAA,CAAe,SAAA;AAAA,MAChD,MAAA,EAAgB,aAAa,MAAA,GAAS,IAAA,CAAK,MAAM,EAAA,CAAG,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MAClF,YAAA,EAAgB,KAAA;AAAA,MAChB,MAAA,EAAgB,SAAA;AAAA,MAChB,OAAA,EAAgB,MAAA;AAAA,MAChB,OAAA,EAAgB,MAAA;AAAA,MAChB,UAAA,EAAgB,QAAA;AAAA,MAChB,cAAA,EAAgB,QAAA;AAAA,MAChB,OAAA,EAAgB;AAAA,KACnB,CAAA;AAAA,EACL;AAAA,EAEQ,oBAAA,CAAqB,KAAwB,OAAA,EAAwB;AACzE,IAAA,GAAA,CAAI,OAAA,CAAQ,MAAA,GAAS,MAAA,CAAO,OAAO,CAAA;AACnC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,MACrB,KAAA,EAAgB,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA,EAAA,CAAA;AAAA,MACvC,MAAA,EAAgB,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA,EAAA,CAAA;AAAA,MACvC,UAAA,EAAgB,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,GAAG,QAAA,GAAW,aAAA;AAAA,MACnD,KAAA,EAAgB,UACM,IAAA,CAAK,KAAA,CAAM,eAAe,eAAA,GAC1B,IAAA,CAAK,MAAM,cAAA,CAAe,SAAA;AAAA,MAChD,MAAA,EAAgB,aAAa,OAAA,GAAU,IAAA,CAAK,MAAM,EAAA,CAAG,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MACnF,YAAA,EAAgB,KAAA;AAAA,MAChB,MAAA,EAAgB,SAAA;AAAA,MAChB,OAAA,EAAgB,MAAA;AAAA,MAChB,OAAA,EAAgB,MAAA;AAAA,MAChB,UAAA,EAAgB,QAAA;AAAA,MAChB,cAAA,EAAgB,QAAA;AAAA,MAChB,OAAA,EAAgB;AAAA,KACnB,CAAA;AAAA,EACL;AACJ,CAAA;;;ACz5BO,SAAS,YAAA,CACZ,IAAA,EACA,aAAA,EACA,KAAA,EAC6E;AAC7E,EAAA,MAAM,UAAA,GAAc,KAAA,EAAO,OAAA,GAAU,IAAI,KAAK,EAAC;AAC/C,EAAA,MAAM,SAAS,EAAE,GAAG,YAAY,GAAI,aAAA,IAAiB,EAAC,EAAG;AAIzD,EAAA,MAAM,cAAe,UAAA,CAA+B,MAAA;AACpD,EAAA,MAAM,aAAe,aAAA,EAA+C,MAAA;AACpE,EAAA,IAAI,eAAe,UAAA,EAAY;AAC3B,IAAA,MAAM,GAAA,GAAyC,EAAE,GAAI,WAAA,IAAe,EAAC,EAAG;AACxE,IAAA,IAAI,UAAA,EAAY;AACZ,MAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,EAAG;AACrC,QAAA,GAAA,CAAI,CAAC,CAAA,GAAI,EAAE,GAAI,GAAA,CAAI,CAAC,CAAA,IAAK,EAAE,OAAA,EAAS,IAAA,EAAM,OAAO,SAAA,EAAU,EAAI,GAAG,UAAA,CAAW,CAAC,CAAA,EAAE;AAAA,MACpF;AAAA,IACJ;AACA,IAAC,OAA2B,MAAA,GAAS,GAAA;AAAA,EACzC;AAEA,EAAA,OAAO;AAAA,IACH,WAAA,EAAc,OAAO,WAAA,IAAgB,SAAA;AAAA,IACrC,SAAA,EAAc,OAAO,SAAA,IAAgB,CAAA;AAAA,IACrC,SAAA,EAAc,OAAO,SAAA,IAAgB,OAAA;AAAA,IACrC,SAAA,EAAc,MAAA,CAAO,SAAA,IAAgB,MAAA,CAAO,WAAA,IAAe,SAAA;AAAA,IAC3D,WAAA,EAAc,OAAO,WAAA,IAAgB,GAAA;AAAA,IACrC,GAAK,MAAA,CAA4B,SAAA,KAAc,UAAa,EAAE,SAAA,EAAY,OAA4B,SAAA,EAAU;AAAA,IAChH,GAAK,MAAA,CAA4B,QAAA,KAAc,UAAa,EAAE,QAAA,EAAY,OAA4B,QAAA,EAAS;AAAA,IAC/G,GAAK,MAAA,CAA2B,MAAA,KAAgB,UAAa,EAAE,MAAA,EAAY,OAA2B,MAAA;AAAO,GACjH;AACJ;AAGO,SAAS,cAAA,CACZ,GAAA,EACA,KAAA,EACA,KAAA,EACI;AACJ,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAA;AAC3B,EAAA,IAAI,KAAA,KAAU,UAAe,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,OAAA,IAClD,KAAA,KAAU,UAAU,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,OAC7B,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AACpD;AAOO,SAAS,YAAA,CAAa,KAAa,KAAA,EAAuB;AAC7D,EAAA,IAAI,CAAC,GAAA,CAAI,UAAA,CAAW,GAAG,GAAG,OAAO,GAAA;AACjC,EAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AACxC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AAC7D,EAAA,IAAI,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA;AACtB,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,IAAA,GAAO,KAAK,KAAA,CAAM,EAAE,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,GAAI,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,OAAA,IAC3D,KAAK,MAAA,KAAW,CAAA,SAAU,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,KAAA,CAAM,EAAE,EAAE,GAAA,CAAI,CAAA,CAAA,KAAK,IAAI,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,OAAA,IAC5E,KAAK,MAAA,KAAW,CAAA,SAAU,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAClD,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,GAAA;AAC9B,EAAA,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,EAAG,IAAI,CAAA,CAAA;AAC1B;;;AC1EA,IAAM,aAAA,GAAgB,CAAA;AAEf,IAAM,iBAAN,MAAyC;AAAA,EAO5C,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,gBAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,GAAA,EAAM,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACjE,IAAA,IAAA,CAAK,MAAA,GAAS,CAAC,KAAK,CAAA;AACpB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,GAAA,EACA,KAAA,EACA,SAAA,EACA,UAAA,EACA,QACA,MAAA,EACA,UAAA,EACA,cAAA,GAAiB,CAAA,EACjB,KAAA,EACI;AACJ,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA;AAC7B,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,KAAA,EAAO,YAAY,MAAM,CAAA;AAElD,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,gBAAA,EAAkB,IAAA,CAAK,OAAO,KAAK,CAAA;AAE1D,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAc,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACrD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AACrE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AACf,IAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAC,CAAA;AACpB,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,cAAc,CAAA;AAC1C,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,WAAA,CAAY,KAAK,CAAA,CAAE,KAAA;AAClC,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,GAAA,CAAI,SAAS,KAAA,EAAO,MAAA,GAAS,EAAA,GAAK,CAAA,EAAG,IAAI,CAAC,CAAA;AAC1C,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,EAAA,EACA,CAAA,EACA,OACA,SAAA,EACA,UAAA,EACA,SACA,MAAA,EACO;AACP,IAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AACrE,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,KAAK,CAAA,IAAK,aAAA;AAAA,EAClC;AAAA,EAEA,SAAA,GAAkC;AAC9B,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AClEA,IAAMC,cAAAA,GAAgB,CAAA;AAEf,IAAM,eAAN,MAAuC;AAAA,EAO1C,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,cAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,GAAA,EAAM,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACjE,IAAA,IAAA,CAAK,MAAA,GAAS,CAAC,KAAK,CAAA;AACpB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,aACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,MAAM,CAAA,GAAI,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AAElE,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,cAAA,EAAgB,IAAA,CAAK,OAAO,KAAK,CAAA;AAExD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAc,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACrD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AACrE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AACf,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,MAAM,CAAA;AACpB,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,EAAA,EACA,OACA,QAAA,EACA,WAAA,EACA,QACA,OAAA,EACO;AACP,IAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACtE,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,KAAK,CAAA,IAAKA,cAAAA;AAAA,EAClC;AAAA,EAEA,SAAA,GAAkC;AAC9B,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC1DA,IAAMA,cAAAA,GAAgB,CAAA;AAGtB,SAAS,mBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEO,IAAM,YAAN,MAAoC;AAAA,EAOvC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,WAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,GAAA,EAAM,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACjE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,WAAA,EAAa,IAAA,CAAK,OAAO,KAAK,CAAA;AAErD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAc,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACrD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAErE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,EAAO;AAEX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA,EAAyB;AAC7D,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,EAAG,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAChD,MAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,MAAA,GAAA,CAAI,IAAA,EAAK;AAAA,IACb;AACA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,OAAO,mBAAmB,CAAA,EAAG,CAAA,EAAG,IAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA,IAAKA,cAAAA;AAAA,EACvD;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,GAAA,GAAM;AAAA,MACR,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA,EAAE;AAAA,MAC9H,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAAE,KAClI;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAE,CAAA,IAAKA,iBAAgB,CAAA,EAAG;AAC/D,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC1GA,IAAMA,cAAAA,GAAgB,CAAA;AAEtB,SAASC,oBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEO,IAAM,aAAN,MAAqC;AAAA,EAOxC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,YAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,GAAA,EAAM,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACjE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,EAAE,EAAA,GAAK,KAAK,EAAA,GAAK,EAAE,CAAA,GAAI,GAAA,GAAM,IAAA,CAAK,EAAA;AAC9D,IAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,EAAE,EAAA,GAAK,EAAA,CAAA,EAAK,KAAK,EAAE,CAAA;AAE/C,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,YAAA,EAAc,IAAA,CAAK,OAAO,KAAK,CAAA;AAEtD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAGrE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,MAAM,SAAA,GAAY,EAAA;AAClB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,GAAA,CAAI,IAAI,EAAA,EAAI,SAAA,EAAW,CAAC,QAAA,EAAU,CAAA,EAAG,WAAW,CAAC,CAAA;AACrD,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,IAAA,GAAA,CAAI,WAAA,GAAc,GAAA;AAClB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,CAAO,EAAA,GAAK,SAAA,GAAY,CAAA,EAAG,EAAE,CAAA;AACjC,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,IAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AAGlB,IAAA,MAAM,MAAA,GAAS,KAAK,SAAA,GAAY,CAAA;AAChC,IAAA,MAAM,MAAA,GAAS,EAAA,IAAM,QAAA,IAAY,CAAA,GAAI,CAAA,GAAI,GAAA,CAAA;AACzC,IAAA,GAAA,CAAI,IAAA,GAAO,0CAAA;AACX,IAAA,GAAA,CAAI,QAAA,CAAS,GAAG,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAC,CAAA,IAAA,CAAA,EAAK,QAAQ,MAAM,CAAA;AAGtD,IAAA,IAAI,UAAA,EAAY;AACZ,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,CAAA,IAAK,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA,EAAyB;AAC/D,QAAA,GAAA,CAAI,SAAA,EAAU;AACd,QAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACjC,QAAA,GAAA,CAAI,IAAA,EAAK;AAAA,MACb;AAAA,IACJ;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,OAAOA,oBAAmB,CAAA,EAAG,CAAA,EAAG,IAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA,IAAKD,cAAAA;AAAA,EACvD;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,GAAA,GAAM;AAAA,MACR,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA,EAAE;AAAA,MAC9H,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAAE,KAClI;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAE,CAAA,IAAKA,iBAAgB,CAAA,EAAG;AAC/D,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACpIA,IAAMA,cAAAA,GAAgB,CAAA;AAEf,IAAM,YAAN,MAAoC;AAAA,EAOvC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,WAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,GAAA,EAAM,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACjE,IAAA,IAAA,CAAK,MAAA,GAAS,CAAC,KAAK,CAAA;AACpB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA;AACvB,IAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,UAAU,MAAM,CAAA;AACrD,IAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,MAAM,CAAA;AAEpD,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,WAAA,EAAa,IAAA,CAAK,OAAO,KAAK,CAAA;AAErD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAGrE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AACf,IAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAC,CAAA;AACpB,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AACf,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,MAAM,CAAA;AACpB,IAAA,GAAA,CAAI,MAAA,EAAO;AAEX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA;AACvB,IAAA,MAAM,QAAQ,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,UAAU,MAAM,CAAA;AACzD,IAAA,MAAM,QAAQ,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,MAAM,CAAA;AAExD,IAAA,IAAI,KAAK,GAAA,CAAI,CAAA,GAAI,KAAK,CAAA,IAAKA,gBAAe,OAAO,IAAA;AAEjD,IAAA,IAAI,KAAK,GAAA,CAAI,CAAA,GAAI,KAAK,CAAA,IAAKA,gBAAe,OAAO,IAAA;AACjD,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,SAAA,GAAkC;AAC9B,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC3EA,IAAMA,cAAAA,GAAgB,CAAA;AAEtB,SAASC,oBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEO,IAAM,kBAAN,MAA0C;AAAA,EAQ7C,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,iBAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAClE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,IAAI,IAAA,CAAK,MAAA;AAC1B,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAGtD,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI,EAAA,EAAI;AACJ,MAAA,MAAM,QAAA,GAAA,CAAY,EAAA,CAAG,KAAA,GAAQ,EAAA,CAAG,KAAA,IAAS,CAAA;AACzC,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU,YAAY,MAAM,CAAA;AAC7D,MAAA,MAAM,WAAW,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAC5D,MAAA,OAAA,GAAU,QAAA,GAAW,SAAA;AAAA,IACzB;AAEA,IAAA,MAAM,GAAA,GAAM,EAAA,EAAI,GAAA,GAAM,EAAA,GAAK,OAAA;AAC3B,IAAA,MAAM,GAAA,GAAM,EAAA,EAAI,GAAA,GAAM,EAAA,GAAK,OAAA;AAE3B,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,iBAAA,EAAmB,IAAA,CAAK,OAAO,KAAK,CAAA;AAE3D,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAGrE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,CAAO,KAAK,GAAG,CAAA;AACnB,IAAA,GAAA,CAAI,MAAA,CAAO,KAAK,GAAG,CAAA;AACnB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,SAAA,GAAY,YAAA,CAAa,CAAA,CAAE,SAAA,EAAW,EAAE,WAAW,CAAA;AACvD,IAAA,GAAA,CAAI,IAAA,EAAK;AAGT,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,IAAI,EAAA,EAAI;AACJ,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,KAAK,GAAG,CAAA;AACnB,MAAA,GAAA,CAAI,MAAA,CAAO,KAAK,GAAG,CAAA;AACnB,MAAA,GAAA,CAAI,MAAA,EAAO;AAAA,IACf;AAEA,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,IAAI,UAAA,EAAY;AACZ,MAAA,MAAM,SAAA,GAAgC,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA;AACzD,MAAA,IAAI,EAAA,EAAI;AACJ,QAAA,MAAM,MAAM,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACxD,QAAA,MAAM,MAAM,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACvD,QAAA,SAAA,CAAU,IAAA,CAAK,CAAC,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,MAC7B;AACA,MAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,CAAA,IAAK,SAAA,EAAW;AAC9B,QAAA,GAAA,CAAI,SAAA,EAAU;AACd,QAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACjC,QAAA,GAAA,CAAI,IAAA,EAAK;AAAA,MACb;AAAA,IACJ;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,IAAI,IAAA,CAAK,MAAA;AAC1B,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,IAAIA,mBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,EAAI,IAAI,EAAA,EAAI,EAAE,CAAA,IAAKD,cAAAA,EAAe,OAAO,IAAA;AAEtE,IAAA,IAAI,EAAA,EAAI;AACJ,MAAA,MAAM,QAAA,GAAA,CAAY,EAAA,CAAG,KAAA,GAAQ,EAAA,CAAG,KAAA,IAAS,CAAA;AACzC,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU,YAAY,MAAM,CAAA;AAC7D,MAAA,MAAM,WAAW,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAC5D,MAAA,MAAM,UAAU,QAAA,GAAW,SAAA;AAC3B,MAAA,IAAIC,mBAAAA,CAAmB,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA,GAAK,OAAA,EAAS,EAAA,EAAI,EAAA,GAAK,OAAO,CAAA,IAAKD,cAAAA,EAAe,OAAO,IAAA;AAAA,IAC9F;AAEA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,MAAM,aAAa,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,GAAG,CAAA,MAAO;AAAA,MAC1C,CAAA;AAAA,MACA,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,UAAU,MAAM,CAAA;AAAA,MAC/C,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,MAAM;AAAA,KAClD,CAAE,CAAA;AACF,IAAA,KAAA,MAAW,EAAE,CAAA,EAAG,EAAA,EAAI,EAAA,MAAQ,UAAA,EAAY;AACpC,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,iBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC7JA,IAAMA,cAAAA,GAAgB,CAAA;AAEtB,SAASC,oBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEO,IAAM,cAAN,MAAsC;AAAA,EAQzC,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,aAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAClE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,IAAI,IAAA,CAAK,MAAA;AAG1B,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAGtD,IAAA,MAAM,WAAA,GAAc,EAAA,GAAK,EAAA,CAAG,KAAA,GAAQ,GAAG,KAAA,GAAQ,CAAA;AAC/C,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,GAAG,KAAA,GAAQ,WAAA,EAAa,YAAY,MAAM,CAAA;AAEpE,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,aAAA,EAAe,IAAA,CAAK,OAAO,KAAK,CAAA;AAEvD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAGrE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,IAAA,CAAK,KAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,EAAG,IAAA,CAAK,IAAI,EAAA,EAAI,EAAE,GAAG,IAAA,CAAK,GAAA,CAAI,KAAK,EAAE,CAAA,EAAG,KAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAC,CAAA;AACjF,IAAA,GAAA,CAAI,SAAA,GAAY,YAAA,CAAa,CAAA,CAAE,SAAA,EAAW,EAAE,WAAW,CAAA;AACvD,IAAA,GAAA,CAAI,IAAA,EAAK;AAGT,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,IAAI,EAAA,EAAI;AACJ,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,EAAO;AAAA,IACf;AAEA,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,IAAI,UAAA,EAAY;AACZ,MAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,MAAA,MAAM,SAAA,GAAgC,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA;AACzD,MAAA,IAAI,EAAA,EAAI;AACJ,QAAA,MAAM,MAAM,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACxD,QAAA,MAAM,MAAM,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACvD,QAAA,SAAA,CAAU,IAAA,CAAK,CAAC,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,MAC7B;AACA,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,CAAA,IAAK,SAAA,EAAW;AAC9B,QAAA,GAAA,CAAI,SAAA,EAAU;AACd,QAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACjC,QAAA,GAAA,CAAI,IAAA,EAAK;AAAA,MACb;AAAA,IACJ;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,IAAI,IAAA,CAAK,MAAA;AAE1B,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,IAAIA,mBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,EAAI,IAAI,EAAA,EAAI,EAAE,CAAA,IAAKD,cAAAA,EAAe,OAAO,IAAA;AAEtE,IAAA,IAAI,EAAA,EAAI;AACJ,MAAA,MAAM,WAAA,GAAc,EAAA,CAAG,KAAA,GAAQ,EAAA,CAAG,KAAA;AAClC,MAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,GAAG,KAAA,GAAQ,WAAA,EAAa,YAAY,MAAM,CAAA;AACpE,MAAA,IAAIC,mBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,EAAI,IAAI,EAAA,EAAI,EAAE,CAAA,IAAKD,cAAAA,EAAe,OAAO,IAAA;AAAA,IAC1E;AAEA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,MAAM,aAAa,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,GAAG,CAAA,MAAO;AAAA,MAC1C,CAAA;AAAA,MACA,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,UAAU,MAAM,CAAA;AAAA,MAC/C,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,MAAM;AAAA,KAClD,CAAE,CAAA;AACF,IAAA,KAAA,MAAW,EAAE,CAAA,EAAG,EAAA,EAAI,EAAA,MAAQ,UAAA,EAAY;AACpC,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,iBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AChJA,IAAMA,cAAAA,GAAgB,CAAA;AAEtB,SAASC,oBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEO,IAAM,kBAAN,MAA0C;AAAA,EAQ7C,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,iBAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAClE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAsC;AAAA,MAChD,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,UAAU,MAAM,CAAA;AAAA,MAC3C,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,MAAM;AAAA,KAC9C;AAEA,IAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAE,IAAI,IAAA,CAAK,MAAA;AAC9B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,KAAK,EAAE,CAAA;AACxB,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,KAAK,EAAE,CAAA;AAExB,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,iBAAA,EAAmB,IAAA,CAAK,OAAO,KAAK,CAAA;AAE3D,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAGrE,IAAA,IAAI,MAAM,EAAA,EAAI;AACV,MAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,KAAK,EAAE,CAAA;AACxB,MAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,KAAK,EAAE,CAAA;AAExB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,SAAA,GAAY,YAAA,CAAa,CAAA,CAAE,SAAA,EAAW,EAAE,WAAW,CAAA;AACvD,MAAA,GAAA,CAAI,IAAA,EAAK;AAGT,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,EAAO;AAGX,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,EAAO;AAEX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAElB,MAAA,IAAI,UAAA,EAAY;AACZ,QAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,QAAA,KAAA,MAAW,CAAC,IAAI,EAAE,CAAA,IAAK,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,IAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,GAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA,EAAyB;AACnF,UAAA,GAAA,CAAI,SAAA,EAAU;AACd,UAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACjC,UAAA,GAAA,CAAI,IAAA,EAAK;AAAA,QACb;AAAA,MACJ;AAAA,IACJ,WAAW,EAAA,EAAI;AACX,MAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,KAAK,EAAE,CAAA;AAGxB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,EAAO;AAGX,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,EAAO;AAEX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAElB,MAAA,IAAI,UAAA,EAAY;AACZ,QAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,QAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,CAAA,IAAK,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,IAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA,EAAyB;AACzE,UAAA,GAAA,CAAI,SAAA,EAAU;AACd,UAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACjC,UAAA,GAAA,CAAI,IAAA,EAAK;AAAA,QACb;AAAA,MACJ;AAAA,IACJ,CAAA,MAAO;AAEH,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,EAAO;AAEX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAElB,MAAA,IAAI,UAAA,EAAY;AACZ,QAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,QAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,CAAA,IAAK,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA,EAAyB;AAC/D,UAAA,GAAA,CAAI,SAAA,EAAU;AACd,UAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACjC,UAAA,GAAA,CAAI,IAAA,EAAK;AAAA,QACb;AAAA,MACJ;AAAA,IACJ;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AAEnC,IAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAsC;AAAA,MAChD,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,UAAU,MAAM,CAAA;AAAA,MAC3C,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,MAAM;AAAA,KAC9C;AAEA,IAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAE,IAAI,IAAA,CAAK,MAAA;AAC9B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,KAAK,EAAE,CAAA;AACxB,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,KAAK,EAAE,CAAA;AAExB,IAAA,IAAIA,mBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,EAAI,IAAI,EAAA,EAAI,EAAE,CAAA,IAAKD,cAAAA,EAAe,OAAO,IAAA;AAEtE,IAAA,IAAI,MAAM,EAAA,EAAI;AACV,MAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,KAAK,EAAE,CAAA;AACxB,MAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,KAAK,EAAE,CAAA;AACxB,MAAA,IAAIC,mBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,EAAI,IAAI,EAAA,EAAI,EAAE,CAAA,IAAKD,cAAAA,EAAe,OAAO,IAAA;AAAA,IAC1E;AAEA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,MAAM,aAAa,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,GAAG,CAAA,MAAO;AAAA,MAC1C,CAAA;AAAA,MACA,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,UAAU,MAAM,CAAA;AAAA,MAC/C,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,MAAM;AAAA,KAClD,CAAE,CAAA;AACF,IAAA,KAAA,MAAW,EAAE,CAAA,EAAG,EAAA,EAAI,EAAA,MAAQ,UAAA,EAAY;AACpC,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,iBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC5LA,IAAM,UAAA,GAAa,CAAC,CAAA,EAAG,KAAA,EAAO,OAAO,GAAA,EAAK,KAAA,EAAO,OAAO,CAAC,CAAA;AACzD,IAAM,mBAAA,GAAsB,CAAC,SAAA,EAAW,SAAA,EAAW,WAAW,SAAA,EAAW,SAAA,EAAW,WAAW,SAAS,CAAA;AACxG,IAAMA,cAAAA,GAAgB,CAAA;AAEf,IAAM,iBAAN,MAAyC;AAAA,EAO5C,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,gBAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAClE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,GAAA,EACA,KAAA,EACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACA,UAAA,EACA,cAAA,GAAiB,CAAA,EACjB,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,KAAA,EAAO,GAAG,KAAK,CAAA;AAC7C,IAAA,MAAM,WAAY,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,KAAA,EAAO,GAAG,KAAK,CAAA;AAC7C,IAAA,MAAM,QAAY,SAAA,GAAY,QAAA;AAE9B,IAAA,MAAM,KAAO,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACzD,IAAA,MAAM,KAAO,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACxD,IAAA,MAAM,KAAO,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACzD,IAAA,MAAM,KAAO,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACxD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC5B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAE5B,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,gBAAA,EAAkB,IAAA,CAAK,OAAO,KAAK,CAAA;AAC1D,IAAA,MAAM,aAAA,GAAgB,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACzD,IAAA,MAAM,WAAA,GAAc,CAAA,CAAE,WAAA,IAAe,mBAAA,CAAoB,CAAC,CAAA;AAE1D,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,GAAA,CAAI,SAAA,GAAY,aAAA;AAEhB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,KAAA,GAAS,WAAW,CAAC,CAAA;AAC3B,MAAA,MAAM,GAAA,GAAS,OAAO,KAAK,CAAA;AAC3B,MAAA,MAAM,GAAA,GAAS,CAAA,CAAE,MAAA,GAAS,GAAG,CAAA;AAC7B,MAAA,IAAI,GAAA,EAAK,YAAY,KAAA,EAAO;AAE5B,MAAA,MAAM,KAAA,GAAS,YAAY,KAAA,GAAQ,KAAA;AACnC,MAAA,MAAM,CAAA,GAAS,KAAA,CAAM,QAAA,CAAS,KAAA,EAAO,YAAY,MAAM,CAAA;AACvD,MAAA,MAAM,YAAY,GAAA,EAAK,KAAA,IAAS,CAAA,CAAE,WAAA,IAAe,oBAAoB,CAAC,CAAA;AACtE,MAAA,MAAM,KAAA,GAAS,YAAA,CAAa,SAAA,EAAW,UAAA,GAAa,MAAM,GAAG,CAAA;AAE7D,MAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,MAAA,cAAA,CAAe,GAAA,EAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,WAAW,aAAa,CAAA;AACrE,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,MAAM,CAAC,CAAA;AAClB,MAAA,GAAA,CAAI,MAAA,CAAO,MAAM,CAAC,CAAA;AAClB,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,MAAA,MAAM,MAAM,CAAA,EAAA,CAAI,KAAA,GAAQ,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AACvC,MAAA,MAAM,MAAM,CAAA,EAAG,GAAG,KAAK,KAAA,CAAM,OAAA,CAAQ,cAAc,CAAC,CAAA,CAAA;AACpD,MAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,MAAA,GAAA,CAAI,QAAA,CAAS,GAAA,EAAK,IAAA,GAAO,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,IACrC;AAIA,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,CAAA,IAAK,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA,EAAyB;AAC/D,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,IAAI,EAAA,EAAI,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAClD,MAAA,GAAA,CAAI,SAAA,GAAY,WAAA;AAChB,MAAA,GAAA,CAAI,IAAA,EAAK;AAAA,IACb;AACA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,EAAA,EACA,CAAA,EACA,OACA,SAAA,EACA,UAAA,EACA,SACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAK,CAAA;AACrE,IAAA,MAAM,QAAA,GAAY,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAK,CAAA;AACrE,IAAA,MAAM,QAAY,SAAA,GAAY,QAAA;AAE9B,IAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC5B,MAAA,MAAM,KAAA,GAAS,YAAY,KAAA,GAAQ,KAAA;AACnC,MAAA,MAAM,KAAA,GAAS,KAAA,CAAM,QAAA,CAAS,KAAA,EAAO,YAAY,MAAM,CAAA;AACvD,MAAA,IAAI,KAAK,GAAA,CAAI,CAAA,GAAI,KAAK,CAAA,IAAKA,gBAAe,OAAO,IAAA;AAAA,IACrD;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,OAAA,GAAU;AAAA,MACZ,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA,EAAE;AAAA,MAC9H,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAAE,KAClI;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,EAAE,CAAA,IAAKA,iBAAgB,CAAA,EAAG;AACvE,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AClIA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,IAAM,cAAA,GAAiB,CAAC,CAAA,EAAG,KAAA,EAAO,OAAO,CAAA,EAAG,KAAA,EAAO,KAAA,EAAO,CAAA,EAAK,KAAK,CAAA;AACpE,IAAM,uBAAA,GAA0B,CAAC,SAAA,EAAW,SAAA,EAAW,WAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,SAAS,CAAA;AAEhH,IAAM,eAAN,MAAuC;AAAA,EAQ1C,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,cAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,GAAA,EACA,KAAA,EACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACA,UAAA,EACA,cAAA,GAAiB,CAAA,EACjB,KAAA,EACI;AACJ,IAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,IAAI,IAAA,CAAK,MAAA;AAC1B,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,cAAA,EAAgB,IAAA,CAAK,OAAO,KAAK,CAAA;AACxD,IAAA,MAAM,WAAA,GAAc,EAAE,WAAA,IAAe,SAAA;AACrC,IAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,CAAA,CAAE,WAAA,IAAe,WAAW,IAAI,CAAA;AAGpE,IAAA,IAAI,CAAC,EAAA,EAAI;AACL,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,WAAA,GAAc,cAAA;AAClB,MAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,MAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,MAAA,GAAA,CAAI,SAAA,GAAY,WAAA;AAChB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACjC,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,OAAA,EAAQ;AACZ,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AAChC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AAEhC,IAAA,MAAM,SAAA,GAAY,EAAA,CAAG,KAAA,GAAQ,EAAA,CAAG,KAAA;AAChC,IAAA,MAAM,aAAA,GAAgB,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AAEzD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,GAAA,CAAI,SAAA,GAAY,aAAA;AAGhB,IAAA,GAAA,CAAI,WAAA,GAAc,cAAA;AAClB,IAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,CAAe,QAAQ,CAAA,EAAA,EAAK;AAC5C,MAAA,MAAM,KAAA,GAAQ,eAAe,CAAC,CAAA;AAC9B,MAAA,MAAM,GAAA,GAAM,OAAO,KAAK,CAAA;AACxB,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,MAAA,GAAS,GAAG,CAAA;AAC1B,MAAA,IAAI,GAAA,EAAK,YAAY,KAAA,EAAO;AAE5B,MAAA,MAAM,UAAA,GAAa,EAAA,CAAG,KAAA,GAAQ,KAAA,GAAQ,SAAA;AACtC,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,UAAA,EAAY,YAAY,MAAM,CAAA;AACvD,MAAA,MAAM,YAAY,GAAA,EAAK,KAAA,IAAS,CAAA,CAAE,WAAA,IAAe,wBAAwB,CAAC,CAAA;AAC1E,MAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,SAAA,EAAW,UAAA,GAAa,MAAM,GAAG,CAAA;AAE5D,MAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,MAAA,cAAA,CAAe,GAAA,EAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,WAAW,aAAa,CAAA;AACrE,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,MAAM,CAAC,CAAA;AAClB,MAAA,GAAA,CAAI,MAAA,CAAO,MAAM,CAAC,CAAA;AAClB,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAElB,MAAA,MAAM,MAAM,CAAA,EAAA,CAAI,KAAA,GAAQ,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AACvC,MAAA,MAAM,MAAM,CAAA,EAAG,GAAG,KAAK,UAAA,CAAW,OAAA,CAAQ,cAAc,CAAC,CAAA,CAAA;AACzD,MAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,MAAA,GAAA,CAAI,QAAA,CAAS,GAAA,EAAK,IAAA,GAAO,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,IACrC;AAGA,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,CAAA,IAAK,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,IAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA,EAAyB;AACzE,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,IAAI,EAAA,EAAI,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAClD,MAAA,GAAA,CAAI,SAAA,GAAY,WAAA;AAChB,MAAA,GAAA,CAAI,IAAA,EAAK;AAAA,IACb;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,EAAA,EACA,CAAA,EACA,OACA,SAAA,EACA,UAAA,EACA,SACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,IAAI,IAAA,CAAK,MAAA;AAC1B,IAAA,MAAM,SAAA,GAAY,EAAA,CAAG,KAAA,GAAQ,EAAA,CAAG,KAAA;AAEhC,IAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAChC,MAAA,MAAM,UAAA,GAAa,EAAA,CAAG,KAAA,GAAQ,KAAA,GAAQ,SAAA;AACtC,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,QAAA,CAAS,UAAA,EAAY,YAAY,MAAM,CAAA;AAC3D,MAAA,IAAI,KAAK,GAAA,CAAI,CAAA,GAAI,KAAK,CAAA,IAAKA,iBAAe,OAAO,IAAA;AAAA,IACrD;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,MAClC,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,UAAU,MAAM,CAAA;AAAA,MAC/C,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,MAAM;AAAA,KAClD,CAAE,CAAA;AACF,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACvE,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACpKA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,IAAME,WAAAA,GAAa,CAAC,CAAA,EAAG,KAAA,EAAO,OAAO,GAAA,EAAK,KAAA,EAAO,OAAO,CAAG,CAAA;AAE3D,SAASD,oBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEO,IAAM,aAAN,MAAqC;AAAA,EAQxC,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,YAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,OAAA,EAAU,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACrE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,GAAA,EACA,KAAA,EACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACA,UAAA,EACA,eAAA,GAAkB,CAAA,EAClB,KAAA,EACI;AACJ,IAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,IAAI,IAAA,CAAK,MAAA;AAC1B,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,YAAA,EAAc,IAAA,CAAK,OAAO,KAAK,CAAA;AACtD,IAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,CAAA,CAAE,WAAA,EAAa,IAAI,CAAA;AAGvD,IAAA,IAAI,CAAC,EAAA,EAAI;AACL,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,WAAA,GAAc,cAAA;AAClB,MAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,MAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,MAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACjC,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,OAAA,EAAQ;AACZ,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAGtD,IAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,IAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAC7B,IAAA,IAAI,QAAQ,CAAA,EAAG;AAGf,IAAA,MAAM,EAAA,GAAK,CAAC,EAAA,GAAK,GAAA;AACjB,IAAA,MAAM,KAAK,EAAA,GAAK,GAAA;AAGhB,IAAA,MAAM,QAAA,GAAA,CAAY,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,KAAK,EAAA,IAAM,EAAA;AAE9C,IAAA,MAAM,aAAA,GAAgB,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AAEzD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,GAAA,CAAI,SAAA,GAAY,aAAA;AAEhB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIC,WAAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,KAAA,GAAQA,YAAW,CAAC,CAAA;AAC1B,MAAA,MAAM,SAAS,KAAA,GAAQ,QAAA;AACvB,MAAA,MAAM,GAAA,GAAM,KAAK,MAAA,GAAS,EAAA;AAC1B,MAAA,MAAM,GAAA,GAAM,KAAK,MAAA,GAAS,EAAA;AAC1B,MAAA,MAAM,GAAA,GAAM,KAAK,MAAA,GAAS,EAAA;AAC1B,MAAA,MAAM,GAAA,GAAM,KAAK,MAAA,GAAS,EAAA;AAE1B,MAAA,MAAM,QAAQ,YAAA,CAAa,CAAA,CAAE,WAAA,EAAa,UAAA,GAAa,MAAM,GAAG,CAAA;AAEhE,MAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,MAAA,cAAA,CAAe,GAAA,EAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,WAAW,aAAa,CAAA;AACrE,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,KAAK,GAAG,CAAA;AACnB,MAAA,GAAA,CAAI,MAAA,CAAO,KAAK,GAAG,CAAA;AACnB,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAElB,MAAA,MAAM,MAAM,CAAA,EAAA,CAAI,KAAA,GAAQ,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AACvC,MAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,MAAA,GAAA,CAAI,QAAA,CAAS,GAAA,EAAK,GAAA,GAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,IACtC;AAGA,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,GAAA,CAAI,IAAI,EAAA,EAAI,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAClD,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,GAAA,CAAI,IAAA,EAAK;AAGT,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,CAAA,IAAK,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA,EAAyB;AAC/D,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,IAAI,EAAA,EAAI,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAClD,MAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,MAAA,GAAA,CAAI,IAAA,EAAK;AAAA,IACb;AAGA,IAAA,GAAA,CAAI,WAAA,GAAc,cAAA;AAClB,IAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAElB,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,IAAI,IAAA,CAAK,MAAA;AAC1B,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,IAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAC7B,IAAA,IAAI,GAAA,KAAQ,GAAG,OAAO,KAAA;AAEtB,IAAA,MAAM,EAAA,GAAK,CAAC,EAAA,GAAK,GAAA;AACjB,IAAA,MAAM,KAAK,EAAA,GAAK,GAAA;AAChB,IAAA,MAAM,QAAA,GAAA,CAAY,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,KAAK,EAAA,IAAM,EAAA;AAE9C,IAAA,KAAA,MAAW,SAASA,WAAAA,EAAY;AAC5B,MAAA,MAAM,SAAS,KAAA,GAAQ,QAAA;AACvB,MAAA,MAAM,GAAA,GAAM,KAAK,MAAA,GAAS,EAAA;AAC1B,MAAA,MAAM,GAAA,GAAM,KAAK,MAAA,GAAS,EAAA;AAC1B,MAAA,MAAM,GAAA,GAAM,KAAK,MAAA,GAAS,EAAA;AAC1B,MAAA,MAAM,GAAA,GAAM,KAAK,MAAA,GAAS,EAAA;AAC1B,MAAA,IAAID,mBAAAA,CAAmB,GAAG,CAAA,EAAG,GAAA,EAAK,KAAK,GAAA,EAAK,GAAG,CAAA,IAAKD,eAAAA,EAAe,OAAO,IAAA;AAAA,IAC9E;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,MAClC,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,UAAU,MAAM,CAAA;AAAA,MAC/C,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,MAAM;AAAA,KAClD,CAAE,CAAA;AACF,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACvE,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACnMA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,IAAM,WAAA,GAAc,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AAE/C,IAAM,cAAN,MAAsC;AAAA,EAOzC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,aAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAClE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,QAAA,GAAW,EAAA,CAAG,QAAA,GAAW,EAAA,CAAG,QAAA;AAClC,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AAEvD,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,aAAA,EAAe,IAAA,CAAK,OAAO,KAAK,CAAA;AACvD,IAAA,MAAM,aAAA,GAAgB,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACzD,IAAA,MAAM,YAAY,YAAA,CAAa,CAAA,CAAE,WAAA,EAAa,UAAA,GAAa,MAAM,IAAI,CAAA;AAErE,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,GAAA,CAAI,SAAA,GAAY,aAAA;AAGhB,IAAA,GAAA,CAAI,WAAA,GAAc,SAAA;AAClB,IAAA,cAAA,CAAe,GAAA,EAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,WAAW,aAAa,CAAA;AACrE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,CAAC,CAAA;AAChB,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,MAAM,CAAA;AACrB,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,CAAC,CAAA;AAChB,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,MAAM,CAAA;AACrB,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC3B,MAAA,MAAM,QAAA,GAAW,EAAA,CAAG,QAAA,GAAW,GAAA,GAAM,QAAA;AACrC,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU,UAAU,MAAM,CAAA;AAGtD,MAAA,IAAI,IAAA,GAAO,GAAA,IAAO,IAAA,GAAO,MAAA,GAAS,EAAA,EAAI;AAEtC,MAAA,GAAA,CAAI,WAAA,GAAc,SAAA;AAClB,MAAA,cAAA,CAAe,GAAA,EAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,WAAW,aAAa,CAAA;AACrE,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,MAAM,CAAC,CAAA;AAClB,MAAA,GAAA,CAAI,MAAA,CAAO,MAAM,MAAM,CAAA;AACvB,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAElB,MAAA,GAAA,CAAI,SAAA,GAAY,SAAA;AAChB,MAAA,GAAA,CAAI,SAAS,MAAA,CAAO,GAAG,CAAA,EAAG,IAAA,GAAO,GAAG,EAAE,CAAA;AAAA,IAC1C;AAGA,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,CAAA,IAAK,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA,EAAyB;AAC/D,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,IAAI,EAAA,EAAI,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAClD,MAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,MAAA,GAAA,CAAI,IAAA,EAAK;AAAA,IACb;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,EAAA,EACA,OACA,QAAA,EACA,WAAA,EACA,QACA,OAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,QAAA,GAAW,EAAA,CAAG,QAAA,GAAW,EAAA,CAAG,QAAA;AAGlC,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,IAAI,KAAK,GAAA,CAAI,CAAA,GAAI,EAAE,CAAA,IAAKA,iBAAe,OAAO,IAAA;AAE9C,IAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC3B,MAAA,MAAM,QAAA,GAAW,EAAA,CAAG,QAAA,GAAW,GAAA,GAAM,QAAA;AACrC,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU,UAAU,MAAM,CAAA;AACtD,MAAA,IAAI,KAAK,GAAA,CAAI,CAAA,GAAI,IAAI,CAAA,IAAKA,iBAAe,OAAO,IAAA;AAAA,IACpD;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,OAAA,GAAU;AAAA,MACZ,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA,EAAE;AAAA,MAC9H,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAAE,KAClI;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACvE,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACvIA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,IAAM,UAAA,GAAa,CAAC,KAAA,EAAO,KAAA,EAAO,KAAK,KAAA,EAAO,KAAA,EAAO,CAAA,EAAK,KAAA,EAAO,KAAK,CAAA;AAE/D,IAAM,aAAN,MAAqC;AAAA,EAOxC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,YAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACpE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,aAAa,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AAE9C,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,YAAA,EAAc,IAAA,CAAK,OAAO,KAAK,CAAA;AACtD,IAAA,MAAM,aAAA,GAAgB,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AAEzD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,GAAA,CAAI,SAAA,GAAY,aAAA;AAEhB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,KAAA,GAAQ,WAAW,CAAC,CAAA;AAC1B,MAAA,MAAM,SAAS,KAAA,GAAQ,UAAA;AACvB,MAAA,MAAM,QAAQ,YAAA,CAAa,CAAA,CAAE,WAAA,EAAa,UAAA,GAAa,MAAM,IAAI,CAAA;AAEjE,MAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,MAAA,cAAA,CAAe,GAAA,EAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,WAAW,aAAa,CAAA;AACrE,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,QAAQ,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACtC,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,MAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,MAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAA,CAAI,KAAA,GAAQ,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,EAAK,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,MAAA,GAAS,EAAE,CAAA;AAAA,IACzE;AAGA,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,GAAA,CAAI,IAAI,EAAA,EAAI,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAClD,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,GAAA,CAAI,IAAA,EAAK;AAGT,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,GAAA,CAAI,IAAI,EAAA,EAAI,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAClD,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,GAAA,CAAI,IAAA,EAAK;AAGT,IAAA,GAAA,CAAI,WAAA,GAAc,YAAA,CAAa,CAAA,CAAE,WAAA,EAAa,GAAG,CAAA;AACjD,IAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAElB,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,aAAa,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AAC9C,IAAA,MAAM,iBAAiB,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AAEhD,IAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC5B,MAAA,MAAM,SAAS,KAAA,GAAQ,UAAA;AACvB,MAAA,IAAI,KAAK,GAAA,CAAI,cAAA,GAAiB,MAAM,CAAA,IAAKA,iBAAe,OAAO,IAAA;AAAA,IACnE;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACpE,IAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AACnE,IAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACpE,IAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAEnE,IAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,GAAA,EAAK,IAAI,GAAG,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACnD,MAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,IAC3C;AACA,IAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,GAAA,EAAK,IAAI,GAAG,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACnD,MAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,IAC3C;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACrIA,IAAMA,eAAAA,GAAgB,CAAA;AAGtB,IAAM,YAAA,GAAe,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA;AAEvC,IAAM,YAAN,MAAoC;AAAA,EAOvC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,WAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA;AAAA,EAGQ,WAAA,CACJ,EAAA,EAAY,EAAA,EACZ,EAAA,EAAY,EAAA,EACsE;AAClF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAElC,IAAA,MAAM,IAAA,GAAO,QAAA,GAAW,YAAA,CAAa,YAAA,CAAa,SAAS,CAAC,CAAA;AAG5D,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAEpC,IAAA,MAAM,OAA2F,EAAC;AAUlG,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,MAAA,GAAS,EAAA;AAGb,IAAA,IAAI,KAAA,GAAQ,UAAA;AAEZ,IAAA,KAAA,IAAS,IAAI,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC/C,MAAA,MAAM,CAAA,GAAI,YAAA,CAAa,CAAC,CAAA,GAAI,IAAA;AAC5B,MAAA,MAAM,QAAA,GAAW,QAAQ,IAAA,CAAK,EAAA;AAC9B,MAAA,MAAM,MAAA,GAAS,QAAA,GAAW,IAAA,CAAK,EAAA,GAAK,CAAA;AAEpC,MAAA,IAAA,CAAK,OAAA,CAAQ,EAAE,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAI,MAAA,EAAQ,CAAA,EAAG,UAAA,EAAY,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,CAAA;AAIlF,MAAA,IAAI,IAAI,CAAA,EAAG;AACP,QAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,CAAA,GAAI,CAAC,CAAA,GAAI,IAAA;AAEpC,QAAA,MAAM,SAAA,GAAY,KAAA,GAAQ,IAAA,CAAK,EAAA,GAAK,CAAA;AACpC,QAAA,MAAA,IAAA,CAAW,CAAA,GAAI,KAAA,IAAS,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AAC1C,QAAA,MAAA,IAAA,CAAW,CAAA,GAAI,KAAA,IAAS,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AAC1C,QAAA,KAAA,IAAS,KAAK,EAAA,GAAK,CAAA;AAAA,MACvB;AAAA,IACJ;AAEA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,MAAM,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACxD,IAAA,MAAM,MAAM,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEvD,IAAA,MAAM,KAAK,GAAA,GAAM,EAAA;AACjB,IAAA,MAAM,KAAK,GAAA,GAAM,EAAA;AAEjB,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,WAAA,EAAa,IAAA,CAAK,OAAO,KAAK,CAAA;AACrD,IAAA,MAAM,aAAA,GAAgB,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AAEzD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,GAAA,CAAI,cAAc,YAAA,CAAa,CAAA,CAAE,WAAA,EAAa,UAAA,GAAa,MAAM,IAAI,CAAA;AACrE,IAAA,GAAA,CAAI,SAAA,GAAY,aAAA;AAChB,IAAA,cAAA,CAAe,GAAA,EAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,WAAW,aAAa,CAAA;AAErE,IAAA,MAAM,OAAO,IAAA,CAAK,WAAA,CAAY,EAAA,EAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AAE5C,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAClC,MAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,MAAA,IAAI,MAAM,CAAA,EAAG;AACT,QAAA,MAAM,MAAA,GAAS,IAAI,EAAA,GAAK,GAAA,CAAI,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,UAAU,CAAA;AACvD,QAAA,MAAM,MAAA,GAAS,IAAI,EAAA,GAAK,GAAA,CAAI,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,UAAU,CAAA;AACvD,QAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,MAAM,CAAA;AAAA,MAC7B;AACA,MAAA,GAAA,CAAI,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,GAAA,CAAI,EAAA,EAAI,GAAA,CAAI,CAAA,EAAG,GAAA,CAAI,UAAA,EAAY,GAAA,CAAI,QAAA,EAAU,KAAK,CAAA;AAAA,IACtE;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,GAAA,CAAI,IAAI,EAAA,EAAI,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAClD,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,GAAA,CAAI,IAAA,EAAK;AAGT,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,GAAA,CAAI,KAAK,GAAA,EAAK,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AACpD,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,GAAA,CAAI,IAAA,EAAK;AAGT,IAAA,GAAA,CAAI,WAAA,GAAc,YAAA,CAAa,CAAA,CAAE,WAAA,EAAa,GAAG,CAAA;AACjD,IAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,CAAO,KAAK,GAAG,CAAA;AACnB,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAElB,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AAEnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,MAAM,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACxD,IAAA,MAAM,MAAM,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,GAAA,GAAM,EAAA;AACjB,IAAA,MAAM,KAAK,GAAA,GAAM,EAAA;AAEjB,IAAA,MAAM,OAAO,IAAA,CAAK,WAAA,CAAY,EAAA,EAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,EAAA;AAEhB,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACpB,MAAA,MAAM,SAAA,GAAY,GAAA,CAAI,QAAA,GAAW,GAAA,CAAI,UAAA;AACrC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,OAAA,EAAS,CAAA,EAAA,EAAK;AAC/B,QAAA,MAAM,IAAI,CAAA,GAAI,OAAA;AACd,QAAA,MAAM,CAAA,GAAI,GAAA,CAAI,UAAA,GAAa,CAAA,GAAI,SAAA;AAC/B,QAAA,MAAM,KAAK,GAAA,CAAI,EAAA,GAAK,IAAI,CAAA,GAAI,IAAA,CAAK,IAAI,CAAC,CAAA;AACtC,QAAA,MAAM,KAAK,GAAA,CAAI,EAAA,GAAK,IAAI,CAAA,GAAI,IAAA,CAAK,IAAI,CAAC,CAAA;AACtC,QAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,iBAAe,OAAO,IAAA;AAAA,MAC5D;AAAA,IACJ;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACpE,IAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AACnE,IAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACpE,IAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAEnE,IAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,GAAA,EAAK,IAAI,GAAG,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACnD,MAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,IAC3C;AACA,IAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,GAAA,EAAK,IAAI,GAAG,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACnD,MAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,IAC3C;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACpMA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,IAAM,iBAAiB,CAAC,KAAA,EAAO,KAAA,EAAO,GAAA,EAAK,OAAO,KAAK,CAAA;AAEvD,SAASC,oBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAGA,SAAS,UACL,EAAA,EAAY,EAAA,EACZ,EAAA,EAAY,EAAA,EACZ,QAAgB,MAAA,EACA;AAChB,EAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,EAAA,MAAM,KAAK,EAAA,GAAK,EAAA;AAChB,EAAA,IAAI,OAAO,CAAA,IAAK,EAAA,KAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;AAExC,EAAA,IAAI,IAAA,GAAO,QAAA;AAEX,EAAA,IAAI,EAAA,GAAK,GAAG,IAAA,GAAO,IAAA,CAAK,IAAI,IAAA,EAAA,CAAO,MAAA,GAAS,MAAM,EAAE,CAAA;AAEpD,EAAA,IAAI,EAAA,GAAK,GAAG,IAAA,GAAO,IAAA,CAAK,IAAI,IAAA,EAAA,CAAO,CAAA,GAAI,MAAM,EAAE,CAAA;AAE/C,EAAA,IAAI,EAAA,GAAK,GAAG,IAAA,GAAO,IAAA,CAAK,IAAI,IAAA,EAAA,CAAO,MAAA,GAAS,MAAM,EAAE,CAAA;AAEpD,EAAA,IAAI,EAAA,GAAK,GAAG,IAAA,GAAO,IAAA,CAAK,IAAI,IAAA,EAAA,CAAO,CAAA,GAAI,MAAM,EAAE,CAAA;AAE/C,EAAA,OAAO,CAAC,EAAA,GAAK,IAAA,GAAO,EAAA,EAAI,EAAA,GAAK,OAAO,EAAE,CAAA;AAC1C;AAEO,IAAM,SAAN,MAAiC;AAAA,EAOpC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,QAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,QAAA,EAAU,IAAA,CAAK,OAAO,KAAK,CAAA;AAClD,IAAA,MAAM,aAAA,GAAgB,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AAEzD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,GAAA,CAAI,SAAA,GAAY,aAAA;AAGhB,IAAA,GAAA,CAAI,WAAA,GAAc,YAAA,CAAa,CAAA,CAAE,WAAA,EAAa,IAAI,CAAA;AAClD,IAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAElB,IAAA,MAAM,WAAA,GAAc,EAAA,CAAG,KAAA,GAAQ,EAAA,CAAG,KAAA;AAElC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,CAAe,QAAQ,CAAA,EAAA,EAAK;AAC5C,MAAA,MAAM,KAAA,GAAQ,eAAe,CAAC,CAAA;AAC9B,MAAA,MAAM,QAAQ,YAAA,CAAa,CAAA,CAAE,WAAA,EAAa,UAAA,GAAa,MAAM,GAAG,CAAA;AAGhE,MAAA,MAAM,WAAA,GAAc,EAAA,CAAG,KAAA,GAAQ,KAAA,GAAQ,WAAA;AACvC,MAAA,MAAM,EAAA,GAAK,EAAA;AACX,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,QAAA,CAAS,WAAA,EAAa,YAAY,MAAM,CAAA;AAGzD,MAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,SAAA,CAAU,IAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,MAAA,EAAQ,MAAM,CAAA;AAEzD,MAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,MAAA,cAAA,CAAe,GAAA,EAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,WAAW,aAAa,CAAA;AACrE,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,MAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,MAAA,GAAA,CAAI,SAAS,CAAA,EAAA,CAAI,KAAA,GAAQ,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,EAAK,IAAA,CAAK,GAAA,CAAI,KAAK,EAAA,EAAI,MAAA,GAAS,EAAE,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,IACvF;AAGA,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,CAAA,IAAK,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA,EAAyB;AAC/D,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,IAAI,EAAA,EAAI,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAClD,MAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,MAAA,GAAA,CAAI,IAAA,EAAK;AAAA,IACb;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,WAAA,GAAc,EAAA,CAAG,KAAA,GAAQ,EAAA,CAAG,KAAA;AAElC,IAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAChC,MAAA,MAAM,WAAA,GAAc,EAAA,CAAG,KAAA,GAAQ,KAAA,GAAQ,WAAA;AACvC,MAAA,MAAM,EAAA,GAAK,EAAA;AACX,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,QAAA,CAAS,WAAA,EAAa,YAAY,MAAM,CAAA;AACzD,MAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,SAAA,CAAU,IAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,MAAA,EAAQ,MAAM,CAAA;AACzD,MAAA,IAAIA,mBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,EAAI,IAAI,EAAA,EAAI,EAAE,CAAA,IAAKD,eAAAA,EAAe,OAAO,IAAA;AAAA,IAC1E;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,OAAA,GAAU;AAAA,MACZ,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA,EAAE;AAAA,MAC9H,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAAE,KAClI;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACvE,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACxKA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,IAAM,eAAA,GAAkB,CAAC,CAAA,EAAG,KAAA,EAAO,GAAG,KAAA,EAAO,KAAA,EAAO,GAAG,KAAK,CAAA;AAC5D,IAAM,wBAAA,GAA2B,CAAC,SAAA,EAAW,SAAA,EAAW,WAAW,SAAA,EAAW,SAAA,EAAW,WAAW,SAAS,CAAA;AAGtG,IAAM,gBAAN,MAAwC;AAAA,EAQ3C,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,eAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACpE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,GAAA,EACA,KAAA,EACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACA,UAAA,EACA,cAAA,GAAiB,CAAA,EACjB,KAAA,EACI;AACJ,IAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,IAAI,IAAA,CAAK,MAAA;AAC1B,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,eAAA,EAAiB,IAAA,CAAK,OAAO,KAAK,CAAA;AACzD,IAAA,MAAM,WAAA,GAAc,EAAE,WAAA,IAAe,SAAA;AACrC,IAAA,MAAM,cAAA,GAAiB,YAAA,CAAa,CAAA,CAAE,WAAA,IAAe,WAAW,IAAI,CAAA;AAGpE,IAAA,IAAI,CAAC,EAAA,EAAI;AACL,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,WAAA,GAAc,cAAA;AAClB,MAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,MAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,MAAA,GAAA,CAAI,SAAA,GAAY,WAAA;AAChB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACjC,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,OAAA,EAAQ;AACZ,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC5B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC5B,IAAA,MAAM,QAAA,GAAW,EAAA,CAAG,KAAA,GAAQ,EAAA,CAAG,KAAA;AAC/B,IAAA,MAAM,aAAA,GAAgB,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AAEzD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,GAAA,CAAI,SAAA,GAAY,aAAA;AAGhB,IAAA,GAAA,CAAI,WAAA,GAAc,cAAA;AAClB,IAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,eAAA,CAAgB,QAAQ,CAAA,EAAA,EAAK;AAC7C,MAAA,MAAM,KAAA,GAAQ,gBAAgB,CAAC,CAAA;AAC/B,MAAA,MAAM,GAAA,GAAM,OAAO,KAAK,CAAA;AACxB,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,MAAA,GAAS,GAAG,CAAA;AAC1B,MAAA,IAAI,GAAA,EAAK,YAAY,KAAA,EAAO;AAE5B,MAAA,MAAM,UAAA,GAAa,EAAA,CAAG,KAAA,GAAQ,KAAA,GAAQ,QAAA;AACtC,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,UAAA,EAAY,YAAY,MAAM,CAAA;AACvD,MAAA,MAAM,YAAY,GAAA,EAAK,KAAA,IAAS,CAAA,CAAE,WAAA,IAAe,yBAAyB,CAAC,CAAA;AAC3E,MAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,SAAA,EAAW,UAAA,GAAa,MAAM,GAAG,CAAA;AAE5D,MAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,MAAA,cAAA,CAAe,GAAA,EAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,WAAW,aAAa,CAAA;AACrE,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,MAAM,CAAC,CAAA;AAClB,MAAA,GAAA,CAAI,MAAA,CAAO,MAAM,CAAC,CAAA;AAClB,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAElB,MAAA,MAAM,MAAM,CAAA,EAAA,CAAI,KAAA,GAAQ,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AACvC,MAAA,MAAM,MAAM,CAAA,EAAG,GAAG,KAAK,UAAA,CAAW,OAAA,CAAQ,cAAc,CAAC,CAAA,CAAA;AACzD,MAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,MAAA,GAAA,CAAI,QAAA,CAAS,GAAA,EAAK,IAAA,GAAO,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,IACrC;AAGA,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,CAAA,IAAK,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,IAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA,EAAyB;AACzE,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,IAAI,EAAA,EAAI,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAClD,MAAA,GAAA,CAAI,SAAA,GAAY,WAAA;AAChB,MAAA,GAAA,CAAI,IAAA,EAAK;AAAA,IACb;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,EAAA,EACA,CAAA,EACA,OACA,SAAA,EACA,UAAA,EACA,SACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,IAAI,IAAA,CAAK,MAAA;AAC1B,IAAA,MAAM,QAAA,GAAW,EAAA,CAAG,KAAA,GAAQ,EAAA,CAAG,KAAA;AAE/B,IAAA,KAAA,MAAW,SAAS,eAAA,EAAiB;AACjC,MAAA,MAAM,UAAA,GAAa,EAAA,CAAG,KAAA,GAAQ,KAAA,GAAQ,QAAA;AACtC,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,QAAA,CAAS,UAAA,EAAY,YAAY,MAAM,CAAA;AAC3D,MAAA,IAAI,KAAK,GAAA,CAAI,CAAA,GAAI,KAAK,CAAA,IAAKA,iBAAe,OAAO,IAAA;AAAA,IACrD;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,MAClC,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,UAAU,MAAM,CAAA;AAAA,MAC/C,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,MAAM;AAAA,KAClD,CAAE,CAAA;AACF,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACvE,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACrKA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,oBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAIA,IAAM,WAAA,GAA0C;AAAA,EAC5C,CAAC,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AAAA,EACZ,CAAC,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AAAA,EACZ,CAAC,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AAAA,EACZ,CAAC,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AAAA,EACZ,CAAC,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AAAA,EACZ,CAAC,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AAAA,EACZ,CAAC,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AAAA,EACZ,CAAC,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AAAA,EACZ,CAAC,CAAA,EAAG,CAAA,EAAG,KAAK;AAChB,CAAA;AAEO,IAAM,UAAN,MAAkC;AAAA,EAOrC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,SAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,SAAA,GAAa,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA,IAAK,CAAA;AACxC,IAAA,MAAM,aAAa,EAAA,GAAK,EAAA;AACxB,IAAA,MAAM,IAAA,GAAO,EAAA,GAAK,EAAA,GAAK,CAAA,GAAI,EAAA;AAE3B,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,SAAA,EAAW,IAAA,CAAK,OAAO,KAAK,CAAA;AAEnD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAErE,IAAA,WAAA,CAAY,QAAQ,CAAC,CAAC,YAAY,SAAA,EAAW,KAAK,GAAG,GAAA,KAAQ;AAMzD,MAAA,MAAM,cAAc,UAAA,GAAa,SAAA;AACjC,MAAA,MAAM,QAAQ,UAAA,GAAa,WAAA;AAG3B,MAAA,MAAM,IAAA,GAAA,CAAQ,MAAA,GAAS,EAAA,KAAO,SAAA,GAAY,IAAA,CAAA;AAC1C,MAAA,MAAM,IAAA,GAAO,EAAA,GAAK,SAAA,GAAY,IAAA,GAAO,IAAA;AACrC,MAAA,MAAM,IAAA,GAAO,KAAK,KAAA,GAAQ,IAAA;AAG1B,MAAA,MAAM,MAAA,GAAS,CAAC,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,KAAK,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,IAAI,CAAA;AAC/D,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,GAAG,CAAA,IAAK,IAAA;AACzB,MAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,CAAA,CAAE,WAAA,EAAa,CAAC,CAAA;AAE3C,MAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,MAAM,IAAI,CAAA;AACrB,MAAA,GAAA,CAAI,MAAA,EAAO;AAGX,MAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,SAAS,EAAE,CAAA;AACzC,MAAA,GAAA,CAAI,QAAA,CAAS,KAAA,EAAO,MAAA,EAAQ,IAAA,GAAO,CAAC,CAAA;AAAA,IACxC,CAAC,CAAA;AAED,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,GAAA,CAAI,IAAI,EAAA,EAAI,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAClD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,GAAA,CAAI,IAAI,EAAA,EAAI,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAClD,IAAA,GAAA,CAAI,IAAA,EAAK;AAET,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,SAAA,GAAa,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA,IAAK,CAAA;AACxC,IAAA,MAAM,aAAa,EAAA,GAAK,EAAA;AACxB,IAAA,MAAM,IAAA,GAAO,EAAA,GAAK,EAAA,GAAK,CAAA,GAAI,EAAA;AAE3B,IAAA,KAAA,MAAW,CAAC,UAAA,EAAY,SAAS,CAAA,IAAK,WAAA,EAAa;AAC/C,MAAA,MAAM,cAAc,UAAA,GAAa,SAAA;AACjC,MAAA,MAAM,QAAQ,UAAA,GAAa,WAAA;AAC3B,MAAA,MAAM,IAAA,GAAA,CAAQ,MAAA,GAAS,EAAA,KAAO,SAAA,GAAY,IAAA,CAAA;AAC1C,MAAA,MAAM,IAAA,GAAO,EAAA,GAAK,SAAA,GAAY,IAAA,GAAO,IAAA;AACrC,MAAA,MAAM,IAAA,GAAO,KAAK,KAAA,GAAQ,IAAA;AAC1B,MAAA,IAAIA,mBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,EAAI,IAAI,IAAA,EAAM,IAAI,CAAA,IAAKD,eAAAA,EAAe,OAAO,IAAA;AAAA,IAC9E;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,GAAA,GAAM;AAAA,MACR,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA,EAAE;AAAA,MAC9H,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAAE,KAClI;AACA,IAAA,MAAM,OAAA,GAAU,CAAC,MAAA,EAAQ,MAAM,CAAA;AAC/B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AAC/D,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,OAAA,CAAQ,CAAC,CAAA,EAAE;AAAA,MAC/C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACrKA,IAAMA,eAAAA,GAAgB,CAAA;AAEf,IAAM,aAAN,MAAqC;AAAA,EAOxC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,YAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAClE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,IAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,GAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,KAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,IAAI,KAAA,GAAQ,IAAA;AAClB,IAAA,MAAM,IAAI,MAAA,GAAS,GAAA;AAEnB,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,YAAA,EAAc,IAAA,CAAK,OAAO,KAAK,CAAA;AAEtD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAGrE,IAAA,GAAA,CAAI,SAAA,GAAY,YAAA,CAAa,CAAA,CAAE,SAAA,EAAW,EAAE,WAAW,CAAA;AACvD,IAAA,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,CAAC,CAAA;AAG5B,IAAA,GAAA,CAAI,UAAA,CAAW,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,CAAC,CAAA;AAG9B,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,GAAA,GAAM,CAAA,GAAI,CAAC,CAAA;AAC5B,IAAA,GAAA,CAAI,MAAA,CAAO,KAAA,EAAO,GAAA,GAAM,CAAA,GAAI,CAAC,CAAA;AAC7B,IAAA,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,GAAA,GAAO,CAAA,GAAI,IAAK,CAAC,CAAA;AAClC,IAAA,GAAA,CAAI,MAAA,CAAO,KAAA,EAAO,GAAA,GAAO,CAAA,GAAI,IAAK,CAAC,CAAA;AACnC,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,IAAA,GAAO,CAAA,GAAI,CAAA,EAAG,GAAG,CAAA;AAC5B,IAAA,GAAA,CAAI,MAAA,CAAO,IAAA,GAAO,CAAA,GAAI,CAAA,EAAG,MAAM,CAAA;AAC/B,IAAA,GAAA,CAAI,MAAA,CAAO,IAAA,GAAQ,CAAA,GAAI,CAAA,GAAK,GAAG,GAAG,CAAA;AAClC,IAAA,GAAA,CAAI,MAAA,CAAO,IAAA,GAAQ,CAAA,GAAI,CAAA,GAAK,GAAG,MAAM,CAAA;AACrC,IAAA,GAAA,CAAI,MAAA,EAAO;AAEX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,IAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,GAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,KAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAE9B,IAAA,OAAO,KAAK,IAAA,IAAQ,CAAA,IAAK,KAAA,IAAS,CAAA,IAAK,OAAO,CAAA,IAAK,MAAA;AAAA,EACvD;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,GAAA,GAAM;AAAA,MACR,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA,EAAE;AAAA,MAC9H,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAAE,KAClI;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AAC/D,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,aAAA,EAAc;AAAA,MAClD;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACxHA,IAAMA,eAAAA,GAAgB,CAAA;AAEf,IAAM,UAAN,MAAkC;AAAA,EAOrC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,SAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,IAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,GAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,KAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,IAAI,KAAA,GAAQ,IAAA;AAClB,IAAA,MAAM,IAAI,MAAA,GAAS,GAAA;AACnB,IAAA,MAAM,IAAA,GAAO,OAAO,CAAA,GAAI,CAAA;AACxB,IAAA,MAAM,IAAA,GAAO,MAAO,CAAA,GAAI,CAAA;AAExB,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,SAAA,EAAW,IAAA,CAAK,OAAO,KAAK,CAAA;AAEnD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAGrE,IAAA,GAAA,CAAI,SAAA,GAAY,YAAA,CAAa,CAAA,CAAE,SAAA,EAAW,EAAE,WAAW,CAAA;AACvD,IAAA,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,CAAC,CAAA;AAG5B,IAAA,GAAA,CAAI,UAAA,CAAW,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,CAAC,CAAA;AAG9B,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,MAAM,GAAG,CAAA;AACpB,IAAA,GAAA,CAAI,MAAA,CAAO,OAAO,MAAM,CAAA;AACxB,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,OAAO,GAAG,CAAA;AACrB,IAAA,GAAA,CAAI,MAAA,CAAO,MAAM,MAAM,CAAA;AACvB,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,MAAM,IAAI,CAAA;AACrB,IAAA,GAAA,CAAI,MAAA,CAAO,OAAO,IAAI,CAAA;AACtB,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,MAAM,GAAG,CAAA;AACpB,IAAA,GAAA,CAAI,MAAA,CAAO,MAAM,MAAM,CAAA;AACvB,IAAA,GAAA,CAAI,MAAA,EAAO;AAEX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,IAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,GAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,KAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAE9B,IAAA,OAAO,KAAK,IAAA,IAAQ,CAAA,IAAK,KAAA,IAAS,CAAA,IAAK,OAAO,CAAA,IAAK,MAAA;AAAA,EACvD;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,GAAA,GAAM;AAAA,MACR,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA,EAAE;AAAA,MAC9H,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAAE,KAClI;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AAC/D,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,aAAA,EAAc;AAAA,MAClD;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACjIA,IAAMA,eAAAA,GAAgB,CAAA;AAEf,IAAM,YAAN,MAAoC;AAAA,EAOvC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,WAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC1B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC1B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA;AAC3B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA;AAE3B,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,WAAA,EAAa,IAAA,CAAK,OAAO,KAAK,CAAA;AAErD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,SAAA,GAAc,YAAA,CAAa,CAAA,CAAE,SAAA,EAAW,EAAE,WAAW,CAAA;AACzD,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAc,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACrD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AACrE,IAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AAC3B,IAAA,GAAA,CAAI,UAAA,CAAW,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AAC7B,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,IAAI,UAAA,EAAY;AACZ,MAAA,KAAA,MAAW,CAAC,IAAI,EAAE,CAAA,IAAK,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,IAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,GAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA,EAAyB;AACnF,QAAA,GAAA,CAAI,SAAA,EAAU;AACd,QAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,KAAK,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACnC,QAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,QAAA,GAAA,CAAI,IAAA,EAAK;AAAA,MACb;AAAA,IACJ;AACA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,GAAIA,eAAAA;AAC9B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,GAAIA,eAAAA;AAC9B,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,IAAIA,eAAAA,GAAgB,CAAA;AAC/C,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,IAAIA,eAAAA,GAAgB,CAAA;AAE/C,IAAA,OAAO,CAAA,IAAK,MAAM,CAAA,IAAK,EAAA,GAAK,MAAM,CAAA,IAAK,EAAA,IAAM,KAAK,EAAA,GAAK,EAAA;AAAA,EAC3D;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAItD,IAAA,MAAM,IAAA,GAAO,MAAM,EAAA,GAAM,EAAA,IAAM,KAAK,aAAA,GAAgB,aAAA,GAAkB,EAAA,IAAM,EAAA,GAAK,aAAA,GAAgB,aAAA;AACjG,IAAA,MAAM,OAAA,GAA8C;AAAA,MAChD,CAAC,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,IAAI,CAAA;AAAA,MAChB,CAAC,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,IAAI;AAAA,KACpB;AACA,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,MAAM,KAAK,OAAA,EAAS;AACxC,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,EAAA,EAAc,MAAA,EAAO;AAAA,MAC9C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACrHA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAAS,cAAA,CAAe,EAAA,EAAY,EAAA,EAAY,IAAA,EAAmC;AAC/E,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,EAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,KAAK,CAAC,CAAA;AACvB,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,KAAK,CAAC,CAAA;AACvB,IAAA,MAAM,SAAA,GAAc,EAAA,GAAK,EAAA,KAAS,EAAA,GAAK,EAAA,IAClC,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,KAAO,EAAA,GAAK,EAAA,CAAA,IAAO,EAAA,GAAK,EAAA,CAAA,GAAM,EAAA;AAC9C,IAAA,IAAI,SAAA,WAAoB,CAAC,MAAA;AAAA,EAC7B;AACA,EAAA,OAAO,MAAA;AACX;AAEO,IAAM,mBAAN,MAA2C;AAAA,EAQ9C,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,kBAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACpE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEQ,UAAA,CACJ,KAAA,EACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACkB;AAClB,IAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,IAAI,IAAA,CAAK,MAAA;AAC1B,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACzC,IAAA,IAAI,QAAQ,IAAA,EAAM;AACd,MAAA,OAAO,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,IAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA;AAAA,IAClD;AAGA,IAAA,MAAM,KAAA,GAAQ,EAAE,EAAA,GAAK,EAAA,CAAA,GAAM,KAAA;AAC3B,IAAA,MAAM,KAAA,GAAA,CAAU,KAAK,EAAA,IAAM,KAAA;AAG3B,IAAA,MAAM,KAAA,GAAA,CAAS,EAAA,GAAK,EAAA,IAAM,KAAA,GAAA,CAAS,KAAK,EAAA,IAAM,KAAA;AAG9C,IAAA,MAAM,EAAA,GAAK,IAAI,EAAA,GAAK,EAAA;AACpB,IAAA,MAAM,EAAA,GAAK,IAAI,EAAA,GAAK,EAAA;AACpB,IAAA,MAAM,KAAK,EAAA,GAAK,KAAA,GAAQ,KAAA,EAAO,EAAA,GAAK,KAAK,KAAA,GAAQ,KAAA;AACjD,IAAA,MAAM,KAAK,EAAA,GAAK,KAAA,GAAQ,KAAA,EAAO,EAAA,GAAK,KAAK,KAAA,GAAQ,KAAA;AAEjD,IAAA,OAAO,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,IAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA;AAAA,EAClD;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,UAAU,IAAA,CAAK,UAAA,CAAW,OAAO,QAAA,EAAU,UAAA,EAAY,QAAQ,MAAM,CAAA;AAE3E,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,kBAAA,EAAoB,IAAA,CAAK,OAAO,KAAK,CAAA;AAE5D,IAAA,GAAA,CAAI,IAAA,EAAK;AAGT,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,CAAE,CAAC,GAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA;AACvC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,CAAE,CAAC,GAAG,OAAA,CAAQ,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,IAC3C;AACA,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,SAAA,GAAY,YAAA,CAAa,CAAA,CAAE,SAAA,EAAW,EAAE,WAAW,CAAA;AACvD,IAAA,GAAA,CAAI,IAAA,EAAK;AAGT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AACrE,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,OAAA,EAAS;AAC1B,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,EAAG,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAChD,MAAA,GAAA,CAAI,IAAA,EAAK;AAAA,IACb;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,UAAU,IAAA,CAAK,UAAA,CAAW,OAAO,QAAA,EAAU,UAAA,EAAY,QAAQ,MAAM,CAAA;AAC3E,IAAA,OAAO,cAAA,CAAe,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA;AAAA,EACvC;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AAEpB,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAClE,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AChJA,IAAMA,eAAAA,GAAgB,CAAA;AAEf,IAAM,UAAN,MAAkC;AAAA,EAOrC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,SAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAClE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,EAAA,GAAA,CAAM,KAAK,EAAA,IAAM,CAAA;AACvB,IAAA,MAAM,EAAA,GAAA,CAAM,KAAK,EAAA,IAAM,CAAA;AACvB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA,GAAI,CAAA;AAC/B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA,GAAI,CAAA;AAE/B,IAAA,IAAI,EAAA,GAAK,CAAA,IAAK,EAAA,GAAK,CAAA,EAAG;AAEtB,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,SAAA,EAAW,IAAA,CAAK,OAAO,KAAK,CAAA;AAEnD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,SAAA,GAAc,YAAA,CAAa,CAAA,CAAE,SAAA,EAAW,EAAE,WAAW,CAAA;AACzD,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAc,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACrD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAErE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,OAAA,CAAQ,IAAI,EAAA,EAAI,EAAA,EAAI,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAC7C,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAElB,IAAA,IAAI,UAAA,EAAY;AACZ,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,CAAA,IAAK,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA,EAAyB;AAC/D,QAAA,GAAA,CAAI,SAAA,EAAU;AACd,QAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,KAAK,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACnC,QAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,QAAA,GAAA,CAAI,IAAA,EAAK;AAAA,MACb;AAAA,IACJ;AACA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,EAAA,GAAA,CAAM,KAAK,EAAA,IAAM,CAAA;AACvB,IAAA,MAAM,EAAA,GAAA,CAAM,KAAK,EAAA,IAAM,CAAA;AACvB,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,IAAI,CAAA,GAAIA,eAAAA;AACnC,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,IAAI,CAAA,GAAIA,eAAAA;AAEnC,IAAA,IAAI,EAAA,GAAK,CAAA,IAAK,EAAA,GAAK,CAAA,EAAG,OAAO,KAAA;AAC7B,IAAA,MAAM,EAAA,GAAA,CAAM,IAAI,EAAA,IAAM,EAAA;AACtB,IAAA,MAAM,EAAA,GAAA,CAAM,IAAI,EAAA,IAAM,EAAA;AACtB,IAAA,OAAO,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,IAAM,CAAA;AAAA,EAChC;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,IAAA,GAAO,MAAM,EAAA,GACZ,EAAA,IAAM,KAAK,aAAA,GAAgB,aAAA,GAC3B,EAAA,IAAM,EAAA,GAAK,aAAA,GAAgB,aAAA;AAClC,IAAA,MAAM,OAAA,GAA8C;AAAA,MAChD,CAAC,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,IAAI,CAAA;AAAA,MAChB,CAAC,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,IAAI;AAAA,KACpB;AACA,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,MAAM,KAAK,OAAA,EAAS;AACxC,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,EAAA,EAAc,MAAA,EAAO;AAAA,MAC9C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC3HA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,oBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEO,IAAM,WAAN,MAAmC;AAAA,EAQtC,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,UAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAClE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAE3E,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,UAAA,EAAY,IAAA,CAAK,OAAO,KAAK,CAAA;AAEpD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAc,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACrD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAErE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,QAAQ,CAAA,EAAA,EAAK;AAChC,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,IAC3B;AACA,IAAA,IAAI,KAAK,QAAA,EAAU;AACf,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,SAAA,GAAY,YAAA,CAAa,CAAA,CAAE,SAAA,EAAW,EAAE,WAAW,CAAA;AACvD,MAAA,GAAA,CAAI,IAAA,EAAK;AAAA,IACb;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAElB,IAAA,IAAI,UAAA,EAAY;AACZ,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,QAAQ,CAAA,EAAA,EAAK;AAChC,QAAA,GAAA,CAAI,SAAA,EAAU;AACd,QAAA,GAAA,CAAI,GAAA,CAAI,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AACvC,QAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,QAAA,GAAA,CAAI,IAAA,EAAK;AAAA,MACb;AAAA,IACJ;AACA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AACb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,MAAA,MAAM,CAAA,GAAA,CAAK,IAAI,CAAA,IAAK,CAAA;AACpB,MAAA,IAAIA,oBAAmB,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAC,GAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA,IAAKD,iBAAe,OAAO,IAAA;AAAA,IACtF;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAClE,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC9GA,IAAMA,eAAAA,GAAgB,CAAA;AAEf,IAAM,SAAN,MAAiC;AAAA,EAOpC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,QAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,IAAK,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AAEtC,IAAA,IAAI,IAAI,CAAA,EAAG;AAEX,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,QAAA,EAAU,IAAA,CAAK,OAAO,KAAK,CAAA;AAElD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,SAAA,GAAc,YAAA,CAAa,CAAA,CAAE,SAAA,EAAW,EAAE,WAAW,CAAA;AACzD,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAc,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACrD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAErE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACjC,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAElB,IAAA,IAAI,UAAA,EAAY;AAEZ,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACjC,MAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,MAAA,GAAA,CAAI,IAAA,EAAK;AAET,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,KAAK,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACnC,MAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,MAAA,GAAA,CAAI,IAAA,EAAK;AAAA,IACb;AACA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,IAAK,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACtC,IAAA,OAAO,KAAK,KAAA,CAAM,CAAA,GAAI,IAAI,CAAA,GAAI,EAAE,KAAK,CAAA,GAAIA,eAAAA;AAAA,EAC7C;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,MAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,IAC3C;AACA,IAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,MAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,IAC3C;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC9GA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEO,IAAM,MAAN,MAA8B;AAAA,EAQjC,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,KAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAClE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,IAAI,IAAA,CAAK,MAAA;AAC1B,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,KAAA,EAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AAE/C,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAGrE,IAAA,MAAM,EAAA,GAAK,IAAI,EAAA,GAAK,EAAA;AACpB,IAAA,MAAM,EAAA,GAAK,IAAI,EAAA,GAAK,EAAA;AACpB,IAAA,MAAM,EAAA,GAAK,IAAI,EAAA,GAAK,EAAA;AAEpB,IAAA,MAAM,CAAA,GAAI,KAAK,EAAA,IAAM,EAAA,GAAK,MAAM,EAAA,IAAM,EAAA,GAAK,EAAA,CAAA,GAAM,EAAA,IAAM,EAAA,GAAK,EAAA,CAAA,CAAA;AAE5D,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,EAAM;AAEpB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,EAAO;AAAA,IACf,CAAA,MAAO;AACH,MAAA,MAAM,GAAA,GAAM,EAAA,GAAK,EAAA,EAAI,GAAA,GAAM,EAAA,GAAK,EAAA;AAChC,MAAA,MAAM,GAAA,GAAM,EAAA,GAAK,EAAA,EAAI,GAAA,GAAM,EAAA,GAAK,EAAA;AAChC,MAAA,MAAM,GAAA,GAAM,EAAA,GAAK,EAAA,EAAI,GAAA,GAAM,EAAA,GAAK,EAAA;AAEhC,MAAA,MAAM,EAAA,GAAA,CAAA,CAAO,GAAA,GAAM,GAAA,KAAQ,EAAA,GAAK,EAAA,CAAA,GAAA,CAAO,GAAA,GAAM,GAAA,KAAQ,EAAA,GAAK,EAAA,CAAA,GAAA,CAAO,GAAA,GAAM,GAAA,KAAQ,EAAA,GAAK,EAAA,CAAA,IAAO,CAAA;AAC3F,MAAA,MAAM,EAAA,GAAA,CAAA,CAAO,GAAA,GAAM,GAAA,KAAQ,EAAA,GAAK,EAAA,CAAA,GAAA,CAAO,GAAA,GAAM,GAAA,KAAQ,EAAA,GAAK,EAAA,CAAA,GAAA,CAAO,GAAA,GAAM,GAAA,KAAQ,EAAA,GAAK,EAAA,CAAA,IAAO,CAAA;AAE3F,MAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AAGrC,MAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AAC1C,MAAA,MAAM,OAAS,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AAC1C,MAAA,MAAM,OAAS,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AAG1C,MAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,EAAW,IAAA,KAAyB;AACxD,QAAA,IAAI,OAAO,CAAA,GAAI,IAAA;AACf,QAAA,OAAO,IAAA,GAAO,CAAA,EAAG,IAAA,IAAQ,IAAA,CAAK,EAAA,GAAK,CAAA;AACnC,QAAA,OAAO,QAAQ,IAAA,CAAK,EAAA,GAAK,CAAA,EAAG,IAAA,IAAQ,KAAK,EAAA,GAAK,CAAA;AAC9C,QAAA,OAAO,IAAA;AAAA,MACX,CAAA;AAEA,MAAA,MAAM,YAAA,GAAe,cAAA,CAAe,IAAA,EAAM,MAAM,CAAA;AAChD,MAAA,MAAM,YAAA,GAAe,cAAA,CAAe,IAAA,EAAM,MAAM,CAAA;AAGhD,MAAA,MAAM,gBAAgB,YAAA,GAAe,YAAA;AAErC,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,MAAA,EAAQ,MAAM,aAAa,CAAA;AAC9C,MAAA,GAAA,CAAI,MAAA,EAAO;AAAA,IACf;AAEA,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,MAAM,OAAA,GAA8B,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA;AACjE,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,OAAA,EAAS;AAC1B,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,EAAG,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAChD,MAAA,GAAA,CAAI,IAAA,EAAK;AAAA,IACb;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AAEnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,IAAI,IAAA,CAAK,MAAA;AAC1B,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,EAAA,GAAK,IAAI,EAAA,GAAK,EAAA;AACpB,IAAA,MAAM,EAAA,GAAK,IAAI,EAAA,GAAK,EAAA;AACpB,IAAA,MAAM,EAAA,GAAK,IAAI,EAAA,GAAK,EAAA;AAEpB,IAAA,MAAM,CAAA,GAAI,KAAK,EAAA,IAAM,EAAA,GAAK,MAAM,EAAA,IAAM,EAAA,GAAK,EAAA,CAAA,GAAM,EAAA,IAAM,EAAA,GAAK,EAAA,CAAA,CAAA;AAE5D,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,GAAI,IAAA,EAAM;AACpB,MAAA,OAAOA,qBAAmB,CAAA,EAAG,CAAA,EAAG,IAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA,IAAKD,eAAAA;AAAA,IACvD;AAEA,IAAA,MAAM,GAAA,GAAM,EAAA,GAAK,EAAA,EAAI,GAAA,GAAM,EAAA,GAAK,EAAA;AAChC,IAAA,MAAM,GAAA,GAAM,EAAA,GAAK,EAAA,EAAI,GAAA,GAAM,EAAA,GAAK,EAAA;AAChC,IAAA,MAAM,GAAA,GAAM,EAAA,GAAK,EAAA,EAAI,GAAA,GAAM,EAAA,GAAK,EAAA;AAEhC,IAAA,MAAM,EAAA,GAAA,CAAA,CAAO,GAAA,GAAM,GAAA,KAAQ,EAAA,GAAK,EAAA,CAAA,GAAA,CAAO,GAAA,GAAM,GAAA,KAAQ,EAAA,GAAK,EAAA,CAAA,GAAA,CAAO,GAAA,GAAM,GAAA,KAAQ,EAAA,GAAK,EAAA,CAAA,IAAO,CAAA;AAC3F,IAAA,MAAM,EAAA,GAAA,CAAA,CAAO,GAAA,GAAM,GAAA,KAAQ,EAAA,GAAK,EAAA,CAAA,GAAA,CAAO,GAAA,GAAM,GAAA,KAAQ,EAAA,GAAK,EAAA,CAAA,GAAA,CAAO,GAAA,GAAM,GAAA,KAAQ,EAAA,GAAK,EAAA,CAAA,IAAO,CAAA;AAE3F,IAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACrC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,IAAI,EAAA,EAAI,CAAA,GAAI,EAAE,CAAA,GAAI,CAAC,CAAA;AAEpD,IAAA,IAAI,IAAA,GAAOA,iBAAe,OAAO,KAAA;AAGjC,IAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AAC1C,IAAA,MAAM,OAAS,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AAC1C,IAAA,MAAM,OAAS,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AAC1C,IAAA,MAAM,OAAS,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AAExC,IAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,EAAW,IAAA,KAAyB;AACxD,MAAA,IAAI,OAAO,CAAA,GAAI,IAAA;AACf,MAAA,OAAO,IAAA,GAAO,CAAA,EAAG,IAAA,IAAQ,IAAA,CAAK,EAAA,GAAK,CAAA;AACnC,MAAA,OAAO,QAAQ,IAAA,CAAK,EAAA,GAAK,CAAA,EAAG,IAAA,IAAQ,KAAK,EAAA,GAAK,CAAA;AAC9C,MAAA,OAAO,IAAA;AAAA,IACX,CAAA;AAEA,IAAA,MAAM,YAAA,GAAe,cAAA,CAAe,IAAA,EAAM,MAAM,CAAA;AAChD,IAAA,MAAM,YAAA,GAAe,cAAA,CAAe,IAAA,EAAM,MAAM,CAAA;AAChD,IAAA,MAAM,YAAA,GAAe,cAAA,CAAe,IAAA,EAAM,MAAM,CAAA;AAEhD,IAAA,MAAM,gBAAgB,YAAA,GAAe,YAAA;AAErC,IAAA,IAAI,CAAC,aAAA,EAAe;AAChB,MAAA,OAAO,YAAA,IAAgB,YAAA;AAAA,IAC3B,CAAA,MAAO;AACH,MAAA,OAAO,YAAA,IAAgB,gBAAgB,YAAA,IAAgB,CAAA;AAAA,IAC3D;AAAA,EACJ;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAClE,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACtMA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEO,IAAM,WAAN,MAAmC;AAAA,EAQtC,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,UAAA;AAChB,IAAA,IAAA,CAAS,SAAA,GAAY,IAAA;AAMjB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,MACnC,GAAG,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,UAAU,MAAM,CAAA;AAAA,MAC9C,GAAG,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,MAAM;AAAA,KACjD,CAAE,CAAA;AAEF,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,UAAA,EAAY,IAAA,CAAK,OAAO,KAAK,CAAA;AAEpD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AAGnD,IAAA,MAAM,aAAa,IAAA,CAAK,QAAA,GAAW,QAAA,CAAS,MAAA,GAAS,SAAS,MAAA,GAAS,CAAA;AAEvE,IAAA,IAAI,cAAc,CAAA,EAAG;AACjB,MAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AACrE,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,SAAS,CAAC,CAAA,CAAE,GAAG,QAAA,CAAS,CAAC,EAAE,CAAC,CAAA;AACvC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACjC,QAAA,GAAA,CAAI,MAAA,CAAO,SAAS,CAAC,CAAA,CAAE,GAAG,QAAA,CAAS,CAAC,EAAE,CAAC,CAAA;AAAA,MAC3C;AACA,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAAA,IACtB;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,QAAA,CAAS,UAAU,CAAA,EAAG;AACxC,MAAA,MAAM,IAAA,GAAO,SAAS,MAAA,GAAS,CAAA;AAC/B,MAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,QAAA,CAAS,IAAA,GAAO,CAAC,CAAA,CAAE,GAAG,QAAA,CAAS,IAAA,GAAO,CAAC,CAAA,CAAE,CAAC,CAAA;AACrD,MAAA,GAAA,CAAI,MAAA,CAAO,SAAS,IAAI,CAAA,CAAE,GAAG,QAAA,CAAS,IAAI,EAAE,CAAC,CAAA;AAC7C,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAAA,IACtB;AAGA,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,MAAM,WAAW,IAAA,CAAK,QAAA,GAAW,QAAA,CAAS,MAAA,GAAS,SAAS,MAAA,GAAS,CAAA;AACrE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AAC/B,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA,CAAE,GAAG,QAAA,CAAS,CAAC,CAAA,CAAE,CAAA,EAAG,aAAa,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACxE,MAAA,GAAA,CAAI,IAAA,EAAK;AAAA,IACb;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AAEnC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,MACnC,GAAG,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,UAAU,MAAM,CAAA;AAAA,MAC9C,GAAG,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,MAAM;AAAA,KACjD,CAAE,CAAA;AAEF,IAAA,MAAM,WAAW,IAAA,CAAK,QAAA,GAAW,SAAS,MAAA,GAAS,CAAA,GAAI,SAAS,MAAA,GAAS,CAAA;AACzE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AAC/B,MAAA,IAAIA,oBAAAA,CAAmB,GAAG,CAAA,EAAG,QAAA,CAAS,CAAC,CAAA,CAAE,CAAA,EAAG,QAAA,CAAS,CAAC,CAAA,CAAE,CAAA,EAAG,SAAS,CAAA,GAAI,CAAC,EAAE,CAAA,EAAG,QAAA,CAAS,IAAI,CAAC,CAAA,CAAE,CAAC,CAAA,IAAKD,eAAAA,EAAe;AAC/G,QAAA,OAAO,IAAA;AAAA,MACX;AAAA,IACJ;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAClE,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AChIA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEO,IAAM,OAAN,MAA+B;AAAA,EAQlC,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,MAAA;AAChB,IAAA,IAAA,CAAS,SAAA,GAAY,IAAA;AAMjB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,MACnC,GAAG,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,UAAU,MAAM,CAAA;AAAA,MAC9C,GAAG,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,MAAM;AAAA,KACjD,CAAE,CAAA;AAGF,IAAA,MAAM,aAAa,IAAA,CAAK,QAAA,GAAW,QAAA,CAAS,MAAA,GAAS,SAAS,MAAA,GAAS,CAAA;AAEvE,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,MAAA,EAAQ,IAAA,CAAK,OAAO,KAAK,CAAA;AAEhD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AAGnD,IAAA,IAAI,cAAc,CAAA,EAAG;AACjB,MAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AACrE,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,SAAS,CAAC,CAAA,CAAE,GAAG,QAAA,CAAS,CAAC,EAAE,CAAC,CAAA;AAEvC,MAAA,IAAI,eAAe,CAAA,EAAG;AAClB,QAAA,GAAA,CAAI,MAAA,CAAO,SAAS,CAAC,CAAA,CAAE,GAAG,QAAA,CAAS,CAAC,EAAE,CAAC,CAAA;AAAA,MAC3C,CAAA,MAAO;AAEH,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,GAAa,GAAG,CAAA,EAAA,EAAK;AACrC,UAAA,MAAM,IAAA,GAAA,CAAQ,SAAS,CAAC,CAAA,CAAE,IAAI,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA,IAAK,CAAA;AACnD,UAAA,MAAM,IAAA,GAAA,CAAQ,SAAS,CAAC,CAAA,CAAE,IAAI,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA,IAAK,CAAA;AACnD,UAAA,GAAA,CAAI,gBAAA,CAAiB,QAAA,CAAS,CAAC,CAAA,CAAE,CAAA,EAAG,SAAS,CAAC,CAAA,CAAE,CAAA,EAAG,IAAA,EAAM,IAAI,CAAA;AAAA,QACjE;AAEA,QAAA,GAAA,CAAI,MAAA,CAAO,QAAA,CAAS,UAAA,GAAa,CAAC,CAAA,CAAE,GAAG,QAAA,CAAS,UAAA,GAAa,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,MACrE;AACA,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAAA,IACtB;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,QAAA,CAAS,UAAU,CAAA,EAAG;AACxC,MAAA,MAAM,IAAA,GAAO,SAAS,MAAA,GAAS,CAAA;AAC/B,MAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,QAAA,CAAS,IAAA,GAAO,CAAC,CAAA,CAAE,GAAG,QAAA,CAAS,IAAA,GAAO,CAAC,CAAA,CAAE,CAAC,CAAA;AACrD,MAAA,GAAA,CAAI,MAAA,CAAO,SAAS,IAAI,CAAA,CAAE,GAAG,QAAA,CAAS,IAAI,EAAE,CAAC,CAAA;AAC7C,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAAA,IACtB;AAGA,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACjC,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA,CAAE,GAAG,QAAA,CAAS,CAAC,CAAA,CAAE,CAAA,EAAG,aAAa,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACxE,MAAA,GAAA,CAAI,IAAA,EAAK;AAAA,IACb;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AAEnC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,MACnC,GAAG,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,UAAU,MAAM,CAAA;AAAA,MAC9C,GAAG,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,MAAM;AAAA,KACjD,CAAE,CAAA;AAGF,IAAA,MAAM,WAAW,IAAA,CAAK,QAAA,GAAW,SAAS,MAAA,GAAS,CAAA,GAAI,SAAS,MAAA,GAAS,CAAA;AACzE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AAC/B,MAAA,IAAIA,oBAAAA,CAAmB,GAAG,CAAA,EAAG,QAAA,CAAS,CAAC,CAAA,CAAE,CAAA,EAAG,QAAA,CAAS,CAAC,CAAA,CAAE,CAAA,EAAG,SAAS,CAAA,GAAI,CAAC,EAAE,CAAA,EAAG,QAAA,CAAS,IAAI,CAAC,CAAA,CAAE,CAAC,CAAA,IAAKD,eAAAA,EAAe;AAC/G,QAAA,OAAO,IAAA;AAAA,MACX;AAAA,IACJ;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAClE,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC3IA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAAS,cAAc,GAAA,EAA+B,KAAA,EAAe,OAAe,GAAA,EAAa,GAAA,EAAa,OAAO,CAAA,EAAS;AAC1H,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AACjD,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,MAAA,CAAO,KAAK,GAAG,CAAA;AACnB,EAAA,GAAA,CAAI,OAAO,GAAA,GAAM,IAAA,GAAO,KAAK,GAAA,CAAI,KAAA,GAAQ,KAAK,EAAA,GAAK,CAAC,CAAA,EAAG,GAAA,GAAM,OAAO,IAAA,CAAK,GAAA,CAAI,QAAQ,IAAA,CAAK,EAAA,GAAK,CAAC,CAAC,CAAA;AACjG,EAAA,GAAA,CAAI,OAAO,GAAA,GAAM,IAAA,GAAO,KAAK,GAAA,CAAI,KAAA,GAAQ,KAAK,EAAA,GAAK,CAAC,CAAA,EAAG,GAAA,GAAM,OAAO,IAAA,CAAK,GAAA,CAAI,QAAQ,IAAA,CAAK,EAAA,GAAK,CAAC,CAAC,CAAA;AACjG,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,IAAA,EAAK;AACb;AAEO,IAAM,aAAN,MAAqC;AAAA,EAOxC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,YAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,GAAA,EAAM,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACjE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,GAAA,EACA,KAAA,EACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACA,UAAA,EACA,cAAA,GAAiB,CAAA,EACjB,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,IAAA,GAAA,CAAU,KAAK,EAAA,IAAM,CAAA;AAC3B,IAAA,MAAM,IAAA,GAAA,CAAU,KAAK,EAAA,IAAM,CAAA;AAC3B,IAAA,MAAM,IAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,IAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,QAAA,GAAW,EAAA;AAEjB,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,YAAA,EAAc,IAAA,CAAK,OAAO,KAAK,CAAA;AACtD,IAAA,MAAM,QAAQ,CAAA,CAAE,WAAA;AAEhB,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAc,KAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAc,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACrD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AACrE,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AAGX,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,MAAM,IAAI,CAAA;AACrB,IAAA,GAAA,CAAI,MAAA,CAAO,MAAM,IAAI,CAAA;AACrB,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,aAAA,CAAc,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA;AACzC,IAAA,aAAA,CAAc,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA;AAGzC,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,EAAA,GAAK,QAAA,EAAU,EAAE,CAAA;AAC5B,IAAA,GAAA,CAAI,MAAA,CAAO,EAAA,GAAK,QAAA,EAAU,EAAE,CAAA;AAC5B,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,EAAA,GAAK,QAAA,EAAU,EAAE,CAAA;AAC5B,IAAA,GAAA,CAAI,MAAA,CAAO,EAAA,GAAK,QAAA,EAAU,EAAE,CAAA;AAC5B,IAAA,GAAA,CAAI,MAAA,EAAO;AAEX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,MAAM,SAAA,GAAa,KAAK,GAAA,CAAI,EAAA,CAAG,QAAQ,EAAA,CAAG,KAAK,CAAA,CAAE,OAAA,CAAQ,cAAc,CAAA;AACvE,IAAA,MAAM,SAAA,GAAA,CAAA,CAAe,EAAA,CAAG,KAAA,GAAQ,EAAA,CAAG,KAAA,IAAS,GAAG,KAAA,GAAQ,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,GAAI,GAAA;AACzE,IAAA,MAAM,KAAA,GAAQ,SAAA;AACd,IAAA,MAAM,KAAA,GAAQ,SAAA;AAEd,IAAA,MAAM,MAAA,GAAS,CAAA;AACf,IAAA,MAAM,IAAA,GAAS,EAAA;AACf,IAAA,MAAM,IAAA,GAAS,EAAA;AACf,IAAA,MAAM,OAAS,IAAA,GAAO,CAAA;AACtB,IAAA,MAAM,IAAA,GAAS,OAAO,IAAA,GAAO,CAAA;AAE7B,IAAA,GAAA,CAAI,SAAA,GAAY,YAAA,CAAa,CAAA,CAAE,SAAA,EAAW,EAAE,WAAW,CAAA;AACvD,IAAA,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA;AACnC,IAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,IAAA,GAAA,CAAI,UAAA,CAAW,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA;AAErC,IAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,IAAA,GAAA,CAAI,SAAS,KAAA,EAAO,IAAA,GAAO,MAAA,EAAQ,IAAA,GAAO,SAAS,EAAE,CAAA;AACrD,IAAA,GAAA,CAAI,SAAS,KAAA,EAAO,IAAA,GAAO,MAAA,EAAQ,IAAA,GAAO,SAAS,EAAE,CAAA;AAErD,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,IAAA,GAAA,CAAQ,KAAK,EAAA,IAAM,CAAA;AACzB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC5B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC5B,IAAA,OAAO,IAAA,CAAK,IAAI,CAAA,GAAI,IAAI,KAAKA,eAAAA,IAAiB,CAAA,IAAK,QAAQ,CAAA,IAAK,IAAA;AAAA,EACpE;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,GAAA,GAAM;AAAA,MACR,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA,EAAE;AAAA,MAC9H,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAAE,KAClI;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AAC/D,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,WAAA,EAAY;AAAA,MAChD;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACtJA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASG,eAAc,GAAA,EAA+B,KAAA,EAAe,OAAe,GAAA,EAAa,GAAA,EAAa,OAAO,CAAA,EAAS;AAC1H,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AACjD,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,MAAA,CAAO,KAAK,GAAG,CAAA;AACnB,EAAA,GAAA,CAAI,OAAO,GAAA,GAAM,IAAA,GAAO,KAAK,GAAA,CAAI,KAAA,GAAQ,KAAK,EAAA,GAAK,CAAC,CAAA,EAAG,GAAA,GAAM,OAAO,IAAA,CAAK,GAAA,CAAI,QAAQ,IAAA,CAAK,EAAA,GAAK,CAAC,CAAC,CAAA;AACjG,EAAA,GAAA,CAAI,OAAO,GAAA,GAAM,IAAA,GAAO,KAAK,GAAA,CAAI,KAAA,GAAQ,KAAK,EAAA,GAAK,CAAC,CAAA,EAAG,GAAA,GAAM,OAAO,IAAA,CAAK,GAAA,CAAI,QAAQ,IAAA,CAAK,EAAA,GAAK,CAAC,CAAC,CAAA;AACjG,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,IAAA,EAAK;AACb;AAEO,IAAM,YAAN,MAAoC;AAAA,EAOvC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,WAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,GAAA,EAAM,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACjE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,IAAA,GAAA,CAAY,KAAK,EAAA,IAAM,CAAA;AAC7B,IAAA,MAAM,KAAA,GAAW,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAChC,IAAA,MAAM,MAAA,GAAW,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAChC,IAAA,MAAM,QAAA,GAAW,EAAA;AAEjB,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,WAAA,EAAa,IAAA,CAAK,OAAO,KAAK,CAAA;AACrD,IAAA,MAAM,QAAQ,CAAA,CAAE,WAAA;AAEhB,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAc,KAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAc,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACrD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AACrE,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AAGX,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,OAAO,IAAI,CAAA;AACtB,IAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,IAAI,CAAA;AACvB,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAAA,cAAAA,CAAc,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,OAAO,IAAI,CAAA;AAC5C,IAAAA,cAAAA,CAAc,GAAA,EAAK,KAAA,EAAO,IAAA,EAAM,QAAQ,IAAI,CAAA;AAG5C,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,EAAA,GAAK,QAAQ,CAAA;AAC5B,IAAA,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,EAAA,GAAK,QAAQ,CAAA;AAC5B,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,EAAA,GAAK,QAAQ,CAAA;AAC5B,IAAA,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,EAAA,GAAK,QAAQ,CAAA;AAC5B,IAAA,GAAA,CAAI,MAAA,EAAO;AAEX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,QAAA,GAAW,GAAG,QAAQ,CAAA;AACnD,IAAA,MAAM,KAAA,GAAW,GAAG,QAAQ,CAAA,KAAA,CAAA;AAC5B,IAAA,MAAM,IAAA,GAAA,CAAY,KAAK,EAAA,IAAM,CAAA;AAC7B,IAAA,MAAM,KAAA,GAAW,GAAA,CAAI,WAAA,CAAY,KAAK,CAAA,CAAE,KAAA;AAExC,IAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,IAAA,GAAA,CAAI,SAAS,KAAA,EAAO,IAAA,GAAO,KAAA,GAAQ,CAAA,EAAG,OAAO,EAAE,CAAA;AAE/C,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,IAAA,GAAA,CAAS,KAAK,EAAA,IAAM,CAAA;AAC1B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC7B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,IAAA,OAAO,IAAA,CAAK,IAAI,CAAA,GAAI,IAAI,KAAKH,eAAAA,IAAiB,CAAA,IAAK,SAAS,CAAA,IAAK,MAAA;AAAA,EACrE;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,GAAA,GAAM;AAAA,MACR,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA,EAAE;AAAA,MAC9H,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAAE,KAClI;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AAC/D,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,WAAA,EAAY;AAAA,MAChD;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACzIA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASG,eAAc,GAAA,EAA+B,KAAA,EAAe,OAAe,GAAA,EAAa,GAAA,EAAa,OAAO,CAAA,EAAS;AAC1H,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AACjD,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,MAAA,CAAO,KAAK,GAAG,CAAA;AACnB,EAAA,GAAA,CAAI,OAAO,GAAA,GAAM,IAAA,GAAO,KAAK,GAAA,CAAI,KAAA,GAAQ,KAAK,EAAA,GAAK,CAAC,CAAA,EAAG,GAAA,GAAM,OAAO,IAAA,CAAK,GAAA,CAAI,QAAQ,IAAA,CAAK,EAAA,GAAK,CAAC,CAAC,CAAA;AACjG,EAAA,GAAA,CAAI,OAAO,GAAA,GAAM,IAAA,GAAO,KAAK,GAAA,CAAI,KAAA,GAAQ,KAAK,EAAA,GAAK,CAAC,CAAA,EAAG,GAAA,GAAM,OAAO,IAAA,CAAK,GAAA,CAAI,QAAQ,IAAA,CAAK,EAAA,GAAK,CAAC,CAAC,CAAA;AACjG,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,IAAA,EAAK;AACb;AAEO,IAAM,iBAAN,MAAyC;AAAA,EAO5C,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,gBAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAClE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,GAAA,EACA,KAAA,EACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACA,UAAA,EACA,cAAA,GAAiB,CAAA,EACjB,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,IAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,GAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,KAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,IAAI,KAAA,GAAQ,IAAA;AAClB,IAAA,MAAM,IAAI,MAAA,GAAS,GAAA;AAEnB,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,gBAAA,EAAkB,IAAA,CAAK,OAAO,KAAK,CAAA;AAC1D,IAAA,MAAM,QAAQ,CAAA,CAAE,WAAA;AAEhB,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AAGnD,IAAA,GAAA,CAAI,SAAA,GAAY,YAAA,CAAa,CAAA,CAAE,SAAA,EAAW,EAAE,WAAW,CAAA;AACvD,IAAA,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,CAAC,CAAA;AAG5B,IAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AACrE,IAAA,GAAA,CAAI,UAAA,CAAW,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,CAAC,CAAA;AAC9B,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAc,KAAA;AAClB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAAA,cAAAA,CAAc,GAAA,EAAK,EAAA,EAAI,EAAA,EAAI,IAAI,EAAE,CAAA;AAGjC,IAAA,MAAM,aAAA,GAAgB,KAAK,GAAA,CAAI,EAAA,CAAG,QAAQ,EAAA,CAAG,KAAK,CAAA,CAAE,OAAA,CAAQ,cAAc,CAAA;AAC1E,IAAA,MAAM,UAAA,GAAgB,SAAS,aAAa,CAAA,CAAA;AAC5C,IAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,IAAA,GAAA,CAAI,SAAS,UAAA,EAAY,KAAA,GAAQ,CAAA,EAAA,CAAI,GAAA,GAAM,UAAU,CAAC,CAAA;AAGtD,IAAA,MAAM,WAAY,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,QAAA,GAAW,GAAG,QAAQ,CAAA;AACpD,IAAA,MAAM,QAAA,GAAY,GAAG,QAAQ,CAAA,KAAA,CAAA;AAC7B,IAAA,MAAM,KAAA,GAAY,GAAA,CAAI,WAAA,CAAY,QAAQ,CAAA,CAAE,KAAA;AAC5C,IAAA,GAAA,CAAI,QAAA,CAAS,UAAU,IAAA,GAAO,CAAA,GAAI,IAAI,KAAA,GAAQ,CAAA,EAAG,SAAS,EAAE,CAAA;AAE5D,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,IAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,GAAIH,eAAAA;AAClC,IAAA,MAAM,GAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,GAAIA,eAAAA;AAClC,IAAA,MAAM,KAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,GAAIA,eAAAA;AAClC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,GAAIA,eAAAA;AAElC,IAAA,OAAO,KAAK,IAAA,IAAQ,CAAA,IAAK,KAAA,IAAS,CAAA,IAAK,OAAO,CAAA,IAAK,MAAA;AAAA,EACvD;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,GAAA,GAAM;AAAA,MACR,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA,EAAE;AAAA,MAC9H,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAAE,KAClI;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AAC/D,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,aAAA,EAAc;AAAA,MAClD;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACzIA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEO,IAAM,QAAN,MAAgC;AAAA,EAOnC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,OAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAClE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,GAAA,EACA,KAAA,EACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACA,UAAA,EACA,cAAA,GAAiB,CAAA,EACjB,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,OAAA,EAAS,IAAA,CAAK,OAAO,KAAK,CAAA;AACjD,IAAA,MAAM,QAAQ,CAAA,CAAE,WAAA;AAChB,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACzC,IAAA,MAAM,SAAA,GAAY,KAAA,GAAQ,IAAA,CAAK,EAAA,GAAK,CAAA;AACpC,IAAA,MAAM,OAAA,GAAU,CAAA;AAEhB,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAc,KAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAc,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACrD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AACrE,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AAGX,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,EAAA,GAAK,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,EAAG,EAAA,GAAK,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,SAAS,CAAC,CAAA;AACjF,IAAA,GAAA,CAAI,MAAA,CAAO,EAAA,GAAK,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,EAAG,EAAA,GAAK,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,SAAS,CAAC,CAAA;AACjF,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,EAAA,GAAK,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,EAAG,EAAA,GAAK,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,SAAS,CAAC,CAAA;AACjF,IAAA,GAAA,CAAI,MAAA,CAAO,EAAA,GAAK,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,EAAG,EAAA,GAAK,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,SAAS,CAAC,CAAA;AACjF,IAAA,GAAA,CAAI,MAAA,EAAO;AAEX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,MAAM,IAAA,GAAA,CAAQ,KAAK,EAAA,IAAM,CAAA;AACzB,IAAA,MAAM,IAAA,GAAA,CAAQ,KAAK,EAAA,IAAM,CAAA;AACzB,IAAA,MAAM,UAAY,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,QAAA,GAAW,GAAG,QAAQ,CAAA;AACpD,IAAA,MAAM,aAAa,EAAA,CAAG,KAAA,GAAQ,EAAA,CAAG,KAAA,EAAO,QAAQ,cAAc,CAAA;AAC9D,IAAA,MAAM,QAAA,GAAa,GAAG,OAAO,CAAA,KAAA,CAAA;AAC7B,IAAA,MAAM,UAAA,GAAa,GAAG,SAAS,CAAA,CAAA;AAG/B,IAAA,MAAM,YAAA,GAAe,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AACzC,IAAA,MAAM,YAAA,GAAgB,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAEzC,IAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,IAAA,GAAA,CAAI,SAAS,QAAA,EAAY,IAAA,GAAO,YAAA,EAAoB,IAAA,GAAO,eAAe,EAAE,CAAA;AAC5E,IAAA,GAAA,CAAI,QAAA,CAAS,UAAA,EAAY,IAAA,GAAO,YAAA,EAAoB,OAAO,YAAY,CAAA;AAGvE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,GAAA,CAAI,IAAI,EAAA,EAAI,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAClD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,GAAA,CAAI,IAAI,EAAA,EAAI,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAClD,IAAA,GAAA,CAAI,IAAA,EAAK;AAET,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,OAAOA,qBAAmB,CAAA,EAAG,CAAA,EAAG,IAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA,IAAKD,eAAAA;AAAA,EACvD;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,GAAA,GAAM;AAAA,MACR,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA,EAAE;AAAA,MAC9H,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAAE,KAClI;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AAC/D,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC5IA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAGA,SAAS,SAAA,CAAU,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,OAAA,EAAmC;AAClG,EAAA,IAAI,EAAA,KAAO,CAAA,EAAG,OAAO,CAAC,IAAI,EAAE,CAAA;AAC5B,EAAA,MAAM,CAAA,GAAA,CAAK,UAAU,EAAA,IAAM,EAAA;AAC3B,EAAA,OAAO,CAAC,OAAA,EAAS,EAAA,GAAK,CAAA,GAAI,EAAE,CAAA;AAChC;AAEO,IAAM,YAAN,MAAoC;AAAA,EAQvC,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,WAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAClE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,IAAI,IAAA,CAAK,MAAA;AAC1B,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,WAAA,EAAa,IAAA,CAAK,OAAO,KAAK,CAAA;AAErD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAErE,IAAA,IAAI,EAAA,EAAI;AACJ,MAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,MAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAGtD,MAAA,MAAM,IAAA,GAAA,CAAQ,KAAK,EAAA,IAAM,CAAA;AACzB,MAAA,MAAM,IAAA,GAAA,CAAQ,KAAK,EAAA,IAAM,CAAA;AAGzB,MAAA,MAAM,OAAO,IAAA,GAAO,EAAA;AACpB,MAAA,MAAM,OAAO,IAAA,GAAO,EAAA;AAGpB,MAAA,MAAM,CAAC,SAAS,OAAO,CAAA,GAAI,UAAU,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAG/D,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,MAAM,IAAI,CAAA;AACrB,MAAA,GAAA,CAAI,MAAA,EAAO;AAGX,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,SAAS,OAAO,CAAA;AAC3B,MAAA,GAAA,CAAI,MAAA,EAAO;AAGX,MAAA,MAAM,CAAC,WAAW,SAAS,CAAA,GAAI,UAAU,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AACnE,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,WAAW,SAAS,CAAA;AAC/B,MAAA,GAAA,CAAI,MAAA,EAAO;AAGX,MAAA,MAAM,CAAC,WAAW,SAAS,CAAA,GAAI,UAAU,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AACnE,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,WAAW,SAAS,CAAA;AAC/B,MAAA,GAAA,CAAI,MAAA,EAAO;AAEX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,MAAA,IAAI,UAAA,EAAY;AACZ,QAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,QAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,CAAA,IAAK,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,IAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA,EAAyB;AACzE,UAAA,GAAA,CAAI,SAAA,EAAU;AACd,UAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACjC,UAAA,GAAA,CAAI,IAAA,EAAK;AAAA,QACb;AAAA,MACJ;AAAA,IACJ,CAAA,MAAO;AAEH,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAAA,IACtB;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,IAAI,IAAA,CAAK,MAAA;AAC1B,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,IAAA,GAAA,CAAQ,KAAK,EAAA,IAAM,CAAA;AACzB,IAAA,MAAM,IAAA,GAAA,CAAQ,KAAK,EAAA,IAAM,CAAA;AACzB,IAAA,MAAM,OAAO,IAAA,GAAO,EAAA;AACpB,IAAA,MAAM,OAAO,IAAA,GAAO,EAAA;AAEpB,IAAA,MAAM,CAAC,SAAS,OAAO,CAAA,GAAI,UAAU,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAC/D,IAAA,MAAM,CAAC,WAAW,SAAS,CAAA,GAAI,UAAU,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AACnE,IAAA,MAAM,CAAC,WAAW,SAAS,CAAA,GAAI,UAAU,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAEnE,IAAA,IAAIA,oBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,EAAI,IAAI,OAAA,EAAS,OAAO,CAAA,IAAKD,eAAAA,EAAe,OAAO,IAAA;AAChF,IAAA,IAAIC,oBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,EAAI,IAAI,SAAA,EAAW,SAAS,CAAA,IAAKD,eAAAA,EAAe,OAAO,IAAA;AACpF,IAAA,IAAIC,oBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,EAAI,IAAI,SAAA,EAAW,SAAS,CAAA,IAAKD,eAAAA,EAAe,OAAO,IAAA;AAEpF,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,MAAM,aAAa,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,GAAG,CAAA,MAAO;AAAA,MAC1C,CAAA;AAAA,MACA,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,UAAU,MAAM,CAAA;AAAA,MAC/C,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,MAAM;AAAA,KAClD,CAAE,CAAA;AACF,IAAA,KAAA,MAAW,EAAE,CAAA,EAAG,EAAA,EAAI,EAAA,MAAQ,UAAA,EAAY;AACpC,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AChLA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEA,SAASG,UAAAA,CAAU,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,OAAA,EAAmC;AAClG,EAAA,IAAI,EAAA,KAAO,CAAA,EAAG,OAAO,CAAC,IAAI,EAAE,CAAA;AAC5B,EAAA,MAAM,CAAA,GAAA,CAAK,UAAU,EAAA,IAAM,EAAA;AAC3B,EAAA,OAAO,CAAC,OAAA,EAAS,EAAA,GAAK,CAAA,GAAI,EAAE,CAAA;AAChC;AAEO,IAAM,kBAAN,MAA0C;AAAA,EAQ7C,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,iBAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,IAAI,IAAA,CAAK,MAAA;AAC1B,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,iBAAA,EAAmB,IAAA,CAAK,OAAO,KAAK,CAAA;AAE3D,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAErE,IAAA,IAAI,EAAA,EAAI;AACJ,MAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,MAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAGtD,MAAA,MAAM,MAAA,GAAA,CAAU,KAAK,EAAA,IAAM,CAAA;AAC3B,MAAA,MAAM,MAAA,GAAA,CAAU,KAAK,EAAA,IAAM,CAAA;AAG3B,MAAA,MAAM,IAAA,GAAA,CAAQ,KAAK,EAAA,IAAM,CAAA;AACzB,MAAA,MAAM,IAAA,GAAA,CAAQ,KAAK,EAAA,IAAM,CAAA;AAGzB,MAAA,MAAM,OAAO,IAAA,GAAO,MAAA;AACpB,MAAA,MAAM,OAAO,IAAA,GAAO,MAAA;AAGpB,MAAA,MAAM,CAAC,SAAS,OAAO,CAAA,GAAIA,WAAU,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAGvE,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,MAAM,CAAA;AACzB,MAAA,GAAA,CAAI,MAAA,CAAO,MAAM,IAAI,CAAA;AACrB,MAAA,GAAA,CAAI,MAAA,EAAO;AAGX,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,MAAM,CAAA;AACzB,MAAA,GAAA,CAAI,MAAA,CAAO,SAAS,OAAO,CAAA;AAC3B,MAAA,GAAA,CAAI,MAAA,EAAO;AAGX,MAAA,MAAM,CAAC,WAAW,SAAS,CAAA,GAAIA,WAAU,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AACnE,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,WAAW,SAAS,CAAA;AAC/B,MAAA,GAAA,CAAI,MAAA,EAAO;AAGX,MAAA,MAAM,CAAC,WAAW,SAAS,CAAA,GAAIA,WAAU,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AACnE,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,WAAW,SAAS,CAAA;AAC/B,MAAA,GAAA,CAAI,MAAA,EAAO;AAEX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,MAAA,IAAI,UAAA,EAAY;AACZ,QAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,QAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,CAAA,IAAK,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,IAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA,EAAyB;AACzE,UAAA,GAAA,CAAI,SAAA,EAAU;AACd,UAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACjC,UAAA,GAAA,CAAI,IAAA,EAAK;AAAA,QACb;AAAA,MACJ;AAAA,IACJ,CAAA,MAAO;AACH,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAAA,IACtB;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,IAAI,IAAA,CAAK,MAAA;AAC1B,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,MAAA,GAAA,CAAU,KAAK,EAAA,IAAM,CAAA;AAC3B,IAAA,MAAM,MAAA,GAAA,CAAU,KAAK,EAAA,IAAM,CAAA;AAC3B,IAAA,MAAM,IAAA,GAAA,CAAQ,KAAK,EAAA,IAAM,CAAA;AACzB,IAAA,MAAM,IAAA,GAAA,CAAQ,KAAK,EAAA,IAAM,CAAA;AACzB,IAAA,MAAM,OAAO,IAAA,GAAO,MAAA;AACpB,IAAA,MAAM,OAAO,IAAA,GAAO,MAAA;AAEpB,IAAA,MAAM,CAAC,SAAS,OAAO,CAAA,GAAIA,WAAU,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AACvE,IAAA,MAAM,CAAC,WAAW,SAAS,CAAA,GAAIA,WAAU,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AACnE,IAAA,MAAM,CAAC,WAAW,SAAS,CAAA,GAAIA,WAAU,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAEnE,IAAA,IAAIH,oBAAAA,CAAmB,GAAG,CAAA,EAAG,MAAA,EAAQ,QAAQ,OAAA,EAAS,OAAO,CAAA,IAAKD,eAAAA,EAAe,OAAO,IAAA;AACxF,IAAA,IAAIC,oBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,EAAI,IAAI,SAAA,EAAW,SAAS,CAAA,IAAKD,eAAAA,EAAe,OAAO,IAAA;AACpF,IAAA,IAAIC,oBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,EAAI,IAAI,SAAA,EAAW,SAAS,CAAA,IAAKD,eAAAA,EAAe,OAAO,IAAA;AAEpF,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,MAAM,aAAa,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,GAAG,CAAA,MAAO;AAAA,MAC1C,CAAA;AAAA,MACA,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,UAAU,MAAM,CAAA;AAAA,MAC/C,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,MAAM;AAAA,KAClD,CAAE,CAAA;AACF,IAAA,KAAA,MAAW,EAAE,CAAA,EAAG,EAAA,EAAI,EAAA,MAAQ,UAAA,EAAY;AACpC,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACpLA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEA,SAASG,UAAAA,CAAU,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,OAAA,EAAmC;AAClG,EAAA,IAAI,EAAA,KAAO,CAAA,EAAG,OAAO,CAAC,IAAI,EAAE,CAAA;AAC5B,EAAA,MAAM,CAAA,GAAA,CAAK,UAAU,EAAA,IAAM,EAAA;AAC3B,EAAA,OAAO,CAAC,OAAA,EAAS,EAAA,GAAK,CAAA,GAAI,EAAE,CAAA;AAChC;AAEO,IAAM,iBAAN,MAAyC;AAAA,EAQ5C,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,gBAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACpE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,IAAI,IAAA,CAAK,MAAA;AAC1B,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,gBAAA,EAAkB,IAAA,CAAK,OAAO,KAAK,CAAA;AAE1D,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAErE,IAAA,IAAI,EAAA,EAAI;AACJ,MAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,MAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAGtD,MAAA,MAAM,IAAA,GAAA,CAAQ,KAAK,EAAA,IAAM,CAAA;AACzB,MAAA,MAAM,IAAA,GAAA,CAAQ,KAAK,EAAA,IAAM,CAAA;AAGzB,MAAA,MAAM,MAAA,GAAA,CAAU,KAAK,IAAA,IAAQ,CAAA;AAC7B,MAAA,MAAM,MAAA,GAAA,CAAU,KAAK,IAAA,IAAQ,CAAA;AAG7B,MAAA,MAAM,OAAO,IAAA,GAAO,MAAA;AACpB,MAAA,MAAM,OAAO,IAAA,GAAO,MAAA;AAGpB,MAAA,MAAM,CAAC,SAAS,OAAO,CAAA,GAAIA,WAAU,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAGvE,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,MAAM,CAAA;AACzB,MAAA,GAAA,CAAI,MAAA,CAAO,MAAM,IAAI,CAAA;AACrB,MAAA,GAAA,CAAI,MAAA,EAAO;AAGX,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,MAAM,CAAA;AACzB,MAAA,GAAA,CAAI,MAAA,CAAO,SAAS,OAAO,CAAA;AAC3B,MAAA,GAAA,CAAI,MAAA,EAAO;AAGX,MAAA,MAAM,CAAC,WAAW,SAAS,CAAA,GAAIA,WAAU,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AACnE,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,WAAW,SAAS,CAAA;AAC/B,MAAA,GAAA,CAAI,MAAA,EAAO;AAGX,MAAA,MAAM,CAAC,WAAW,SAAS,CAAA,GAAIA,WAAU,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AACnE,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,WAAW,SAAS,CAAA;AAC/B,MAAA,GAAA,CAAI,MAAA,EAAO;AAEX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,MAAA,IAAI,UAAA,EAAY;AACZ,QAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,QAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,CAAA,IAAK,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,IAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA,EAAyB;AACzE,UAAA,GAAA,CAAI,SAAA,EAAU;AACd,UAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACjC,UAAA,GAAA,CAAI,IAAA,EAAK;AAAA,QACb;AAAA,MACJ;AAAA,IACJ,CAAA,MAAO;AACH,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAAA,IACtB;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,IAAI,IAAA,CAAK,MAAA;AAC1B,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,IAAA,GAAA,CAAQ,KAAK,EAAA,IAAM,CAAA;AACzB,IAAA,MAAM,IAAA,GAAA,CAAQ,KAAK,EAAA,IAAM,CAAA;AACzB,IAAA,MAAM,MAAA,GAAA,CAAU,KAAK,IAAA,IAAQ,CAAA;AAC7B,IAAA,MAAM,MAAA,GAAA,CAAU,KAAK,IAAA,IAAQ,CAAA;AAC7B,IAAA,MAAM,OAAO,IAAA,GAAO,MAAA;AACpB,IAAA,MAAM,OAAO,IAAA,GAAO,MAAA;AAEpB,IAAA,MAAM,CAAC,SAAS,OAAO,CAAA,GAAIA,WAAU,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AACvE,IAAA,MAAM,CAAC,WAAW,SAAS,CAAA,GAAIA,WAAU,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AACnE,IAAA,MAAM,CAAC,WAAW,SAAS,CAAA,GAAIA,WAAU,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAEnE,IAAA,IAAIH,oBAAAA,CAAmB,GAAG,CAAA,EAAG,MAAA,EAAQ,QAAQ,OAAA,EAAS,OAAO,CAAA,IAAKD,eAAAA,EAAe,OAAO,IAAA;AACxF,IAAA,IAAIC,oBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,EAAI,IAAI,SAAA,EAAW,SAAS,CAAA,IAAKD,eAAAA,EAAe,OAAO,IAAA;AACpF,IAAA,IAAIC,oBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,EAAI,IAAI,SAAA,EAAW,SAAS,CAAA,IAAKD,eAAAA,EAAe,OAAO,IAAA;AAEpF,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,MAAM,aAAa,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,GAAG,CAAA,MAAO;AAAA,MAC1C,CAAA;AAAA,MACA,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,UAAU,MAAM,CAAA;AAAA,MAC/C,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,MAAM;AAAA,KAClD,CAAE,CAAA;AACF,IAAA,KAAA,MAAW,EAAE,CAAA,EAAG,EAAA,EAAI,EAAA,MAAQ,UAAA,EAAY;AACpC,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACpLA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEA,SAASG,UAAAA,CAAU,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,OAAA,EAAmC;AAClG,EAAA,IAAI,EAAA,KAAO,CAAA,EAAG,OAAO,CAAC,IAAI,EAAE,CAAA;AAC5B,EAAA,MAAM,CAAA,GAAA,CAAK,UAAU,EAAA,IAAM,EAAA;AAC3B,EAAA,OAAO,CAAC,OAAA,EAAS,EAAA,GAAK,CAAA,GAAI,EAAE,CAAA;AAChC;AAEO,IAAM,kBAAN,MAA0C;AAAA,EAQ7C,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,iBAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,IAAI,IAAA,CAAK,MAAA;AAC1B,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,iBAAA,EAAmB,IAAA,CAAK,OAAO,KAAK,CAAA;AAE3D,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAErE,IAAA,IAAI,EAAA,EAAI;AACJ,MAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,MAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAGtD,MAAA,MAAM,IAAA,GAAA,CAAQ,KAAK,EAAA,IAAM,CAAA;AACzB,MAAA,MAAM,IAAA,GAAA,CAAQ,KAAK,EAAA,IAAM,CAAA;AAGzB,MAAA,MAAM,OAAO,IAAA,GAAO,EAAA;AACpB,MAAA,MAAM,OAAO,IAAA,GAAO,EAAA;AAGpB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,MAAM,IAAI,CAAA;AACrB,MAAA,GAAA,CAAI,MAAA,EAAO;AAGX,MAAA,MAAM,CAAC,SAAS,OAAO,CAAA,GAAIA,WAAU,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAC/D,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,SAAS,OAAO,CAAA;AAC3B,MAAA,GAAA,CAAI,MAAA,EAAO;AAGX,MAAA,MAAM,CAAC,WAAW,SAAS,CAAA,GAAIA,WAAU,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AACnE,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,WAAW,SAAS,CAAA;AAC/B,MAAA,GAAA,CAAI,MAAA,EAAO;AAGX,MAAA,MAAM,CAAC,WAAW,SAAS,CAAA,GAAIA,WAAU,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AACnE,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,WAAW,SAAS,CAAA;AAC/B,MAAA,GAAA,CAAI,MAAA,EAAO;AAIX,MAAA,MAAM,OAAA,GAAA,CAAW,KAAK,EAAA,IAAM,CAAA;AAC5B,MAAA,MAAM,OAAA,GAAA,CAAW,KAAK,EAAA,IAAM,CAAA;AAC5B,MAAA,MAAM,CAAC,YAAY,UAAU,CAAA,GAAIA,WAAU,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAC/E,MAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAClB,MAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,SAAS,OAAO,CAAA;AAC3B,MAAA,GAAA,CAAI,MAAA,CAAO,YAAY,UAAU,CAAA;AACjC,MAAA,GAAA,CAAI,MAAA,EAAO;AAGX,MAAA,MAAM,OAAA,GAAA,CAAW,KAAK,EAAA,IAAM,CAAA;AAC5B,MAAA,MAAM,OAAA,GAAA,CAAW,KAAK,EAAA,IAAM,CAAA;AAC5B,MAAA,MAAM,CAAC,YAAY,UAAU,CAAA,GAAIA,WAAU,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAC/E,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,SAAS,OAAO,CAAA;AAC3B,MAAA,GAAA,CAAI,MAAA,CAAO,YAAY,UAAU,CAAA;AACjC,MAAA,GAAA,CAAI,MAAA,EAAO;AAEX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,MAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AAGlB,MAAA,IAAI,UAAA,EAAY;AACZ,QAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,QAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,CAAA,IAAK,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,IAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA,EAAyB;AACzE,UAAA,GAAA,CAAI,SAAA,EAAU;AACd,UAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACjC,UAAA,GAAA,CAAI,IAAA,EAAK;AAAA,QACb;AAAA,MACJ;AAAA,IACJ,CAAA,MAAO;AACH,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAAA,IACtB;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,IAAI,IAAA,CAAK,MAAA;AAC1B,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,IAAA,GAAA,CAAQ,KAAK,EAAA,IAAM,CAAA;AACzB,IAAA,MAAM,IAAA,GAAA,CAAQ,KAAK,EAAA,IAAM,CAAA;AACzB,IAAA,MAAM,OAAO,IAAA,GAAO,EAAA;AACpB,IAAA,MAAM,OAAO,IAAA,GAAO,EAAA;AAEpB,IAAA,MAAM,CAAC,SAAS,OAAO,CAAA,GAAIA,WAAU,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAC/D,IAAA,MAAM,CAAC,WAAW,SAAS,CAAA,GAAIA,WAAU,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AACnE,IAAA,MAAM,CAAC,WAAW,SAAS,CAAA,GAAIA,WAAU,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAEnE,IAAA,IAAIH,oBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,EAAI,IAAI,OAAA,EAAS,OAAO,CAAA,IAAKD,eAAAA,EAAe,OAAO,IAAA;AAChF,IAAA,IAAIC,oBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,EAAI,IAAI,SAAA,EAAW,SAAS,CAAA,IAAKD,eAAAA,EAAe,OAAO,IAAA;AACpF,IAAA,IAAIC,oBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,EAAI,IAAI,SAAA,EAAW,SAAS,CAAA,IAAKD,eAAAA,EAAe,OAAO,IAAA;AAGpF,IAAA,MAAM,OAAA,GAAA,CAAW,KAAK,EAAA,IAAM,CAAA;AAC5B,IAAA,MAAM,OAAA,GAAA,CAAW,KAAK,EAAA,IAAM,CAAA;AAC5B,IAAA,MAAM,CAAC,YAAY,UAAU,CAAA,GAAII,WAAU,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAC/E,IAAA,IAAIH,oBAAAA,CAAmB,GAAG,CAAA,EAAG,OAAA,EAAS,SAAS,UAAA,EAAY,UAAU,CAAA,IAAKD,eAAAA,EAAe,OAAO,IAAA;AAEhG,IAAA,MAAM,OAAA,GAAA,CAAW,KAAK,EAAA,IAAM,CAAA;AAC5B,IAAA,MAAM,OAAA,GAAA,CAAW,KAAK,EAAA,IAAM,CAAA;AAC5B,IAAA,MAAM,CAAC,YAAY,UAAU,CAAA,GAAII,WAAU,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AAC/E,IAAA,IAAIH,oBAAAA,CAAmB,GAAG,CAAA,EAAG,OAAA,EAAS,SAAS,UAAA,EAAY,UAAU,CAAA,IAAKD,eAAAA,EAAe,OAAO,IAAA;AAEhG,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,MAAM,aAAa,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,GAAG,CAAA,MAAO;AAAA,MAC1C,CAAA;AAAA,MACA,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,UAAU,MAAM,CAAA;AAAA,MAC/C,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,MAAM;AAAA,KAClD,CAAE,CAAA;AACF,IAAA,KAAA,MAAW,EAAE,CAAA,EAAG,EAAA,EAAI,EAAA,MAAQ,UAAA,EAAY;AACpC,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC7MA,IAAMA,eAAAA,GAAgB,CAAA;AAGtB,IAAM,WAAA,GAAc,CAAC,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA,EAAK,CAAA,EAAK,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA;AAE1D,IAAM,eAAN,MAAuC;AAAA,EAO1C,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,cAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC1B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC1B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA;AAC3B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA;AAE3B,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,cAAA,EAAgB,IAAA,CAAK,OAAO,KAAK,CAAA;AAExD,IAAA,GAAA,CAAI,IAAA,EAAK;AAGT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AACrE,IAAA,GAAA,CAAI,UAAA,CAAW,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AAC7B,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,MAAM,UAAU,WAAA,CAAY,MAAA;AAC5B,IAAA,MAAM,OAAO,EAAA,GAAK,OAAA;AAClB,IAAA,MAAM,UAAU,EAAA,GAAK,GAAA;AACrB,IAAA,MAAM,OAAA,GAAU,YAAA,CAAa,CAAA,CAAE,SAAA,EAAW,EAAE,WAAW,CAAA;AAEvD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAC9B,MAAA,MAAM,IAAA,GAAO,OAAA,GAAU,WAAA,CAAY,CAAC,CAAA;AACpC,MAAA,MAAM,IAAA,GAAO,KAAK,CAAA,GAAI,IAAA;AACtB,MAAA,GAAA,CAAI,SAAA,GAAY,OAAA;AAChB,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,IACzC;AAGA,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,GAAA,CAAI,QAAA,CAAS,gBAAA,EAAkB,EAAA,GAAK,CAAA,EAAG,KAAK,EAAE,CAAA;AAG9C,IAAA,IAAI,UAAA,EAAY;AACZ,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,CAAA,IAAK,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA,EAAyB;AAC/D,QAAA,GAAA,CAAI,SAAA,EAAU;AACd,QAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,KAAK,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACnC,QAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,QAAA,GAAA,CAAI,IAAA,EAAK;AAAA,MACb;AAAA,IACJ;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,GAAIA,eAAAA;AAC9B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,GAAIA,eAAAA;AAC9B,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,IAAIA,eAAAA,GAAgB,CAAA;AAC/C,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,IAAIA,eAAAA,GAAgB,CAAA;AAE/C,IAAA,OAAO,CAAA,IAAK,MAAM,CAAA,IAAK,EAAA,GAAK,MAAM,CAAA,IAAK,EAAA,IAAM,KAAK,EAAA,GAAK,EAAA;AAAA,EAC3D;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,OAAA,GAAsC;AAAA,MACxC,CAAC,GAAG,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,EAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA,EAAG,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAAA,MACvH,CAAC,GAAG,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,EAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA,EAAG,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC;AAAA,KAC3H;AACA,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,KAAK,OAAA,EAAS;AAChC,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,EAAA,EAAI,MAAA,EAAQ,aAAA,EAAc;AAAA,MACnD;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACjIA,IAAMA,eAAAA,GAAgB,CAAA;AAGtB,IAAMK,YAAAA,GAAc,CAAC,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA,EAAK,CAAA,EAAK,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA;AAE1D,IAAM,aAAN,MAAqC;AAAA,EAOxC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,YAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAClE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC1B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC1B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA;AAC3B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA;AAE3B,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,YAAA,EAAc,IAAA,CAAK,OAAO,KAAK,CAAA;AAEtD,IAAA,GAAA,CAAI,IAAA,EAAK;AAGT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AACrE,IAAA,GAAA,CAAI,UAAA,CAAW,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AAC7B,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,MAAM,UAAUA,YAAAA,CAAY,MAAA;AAC5B,IAAA,MAAM,OAAO,EAAA,GAAK,OAAA;AAClB,IAAA,MAAM,UAAU,EAAA,GAAK,GAAA;AACrB,IAAA,MAAM,OAAA,GAAU,YAAA,CAAa,CAAA,CAAE,SAAA,EAAW,EAAE,WAAW,CAAA;AAEvD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAC9B,MAAA,MAAM,IAAA,GAAO,OAAA,GAAUA,YAAAA,CAAY,CAAC,CAAA;AACpC,MAAA,MAAM,IAAA,GAAO,KAAK,CAAA,GAAI,IAAA;AACtB,MAAA,GAAA,CAAI,SAAA,GAAY,OAAA;AAChB,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,IACzC;AAGA,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,GAAA,CAAI,QAAA,CAAS,aAAA,EAAe,EAAA,GAAK,CAAA,EAAG,KAAK,EAAE,CAAA;AAG3C,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,GAAA,CAAI,IAAI,EAAA,EAAI,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAClD,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,GAAA,CAAI,IAAA,EAAK;AAGT,IAAA,IAAI,UAAA,EAAY;AACZ,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,CAAA,IAAK,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA,EAAyB;AAC/D,QAAA,GAAA,CAAI,SAAA,EAAU;AACd,QAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,KAAK,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACnC,QAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,QAAA,GAAA,CAAI,IAAA,EAAK;AAAA,MACb;AAAA,IACJ;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,GAAIL,eAAAA;AAC9B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,GAAIA,eAAAA;AAC9B,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,IAAIA,eAAAA,GAAgB,CAAA;AAC/C,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,IAAIA,eAAAA,GAAgB,CAAA;AAE/C,IAAA,OAAO,CAAA,IAAK,MAAM,CAAA,IAAK,EAAA,GAAK,MAAM,CAAA,IAAK,EAAA,IAAM,KAAK,EAAA,GAAK,EAAA;AAAA,EAC3D;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,OAAA,GAAsC;AAAA,MACxC,CAAC,GAAG,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,EAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA,EAAG,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAAA,MACvH,CAAC,GAAG,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,EAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA,EAAG,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC;AAAA,KAC3H;AACA,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,KAAK,OAAA,EAAS;AAChC,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,EAAA,EAAI,MAAA,EAAQ,aAAA,EAAc;AAAA,MACnD;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACvIA,IAAMA,eAAAA,GAAgB,CAAA;AAGtB,IAAMK,YAAAA,GAAc,CAAC,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,CAAA,EAAK,CAAA,EAAK,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA;AAEtE,IAAM,gBAAN,MAAwC;AAAA,EAO3C,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,eAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,GAAA,EAAM,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACjE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC1B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC1B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA;AAC3B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA;AAE3B,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,eAAA,EAAiB,IAAA,CAAK,OAAO,KAAK,CAAA;AAEzD,IAAA,GAAA,CAAI,IAAA,EAAK;AAGT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AACrE,IAAA,GAAA,CAAI,UAAA,CAAW,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AAC7B,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,MAAM,UAAUA,YAAAA,CAAY,MAAA;AAC5B,IAAA,MAAM,OAAO,EAAA,GAAK,OAAA;AAClB,IAAA,MAAM,UAAU,EAAA,GAAK,GAAA;AACrB,IAAA,MAAM,OAAA,GAAU,YAAA,CAAa,CAAA,CAAE,SAAA,EAAW,EAAE,WAAW,CAAA;AAEvD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAC9B,MAAA,MAAM,IAAA,GAAO,OAAA,GAAUA,YAAAA,CAAY,CAAC,CAAA;AACpC,MAAA,MAAM,IAAA,GAAO,KAAK,CAAA,GAAI,IAAA;AACtB,MAAA,GAAA,CAAI,SAAA,GAAY,OAAA;AAChB,MAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,IACzC;AAGA,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,GAAA,CAAI,QAAA,CAAS,gBAAA,EAAkB,EAAA,GAAK,CAAA,EAAG,KAAK,EAAE,CAAA;AAG9C,IAAA,IAAI,UAAA,EAAY;AACZ,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,CAAA,IAAK,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA,EAAyB;AAC/D,QAAA,GAAA,CAAI,SAAA,EAAU;AACd,QAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,KAAK,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACnC,QAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,QAAA,GAAA,CAAI,IAAA,EAAK;AAAA,MACb;AAAA,IACJ;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,GAAIL,eAAAA;AAC9B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,GAAIA,eAAAA;AAC9B,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,IAAIA,eAAAA,GAAgB,CAAA;AAC/C,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,IAAIA,eAAAA,GAAgB,CAAA;AAE/C,IAAA,OAAO,CAAA,IAAK,MAAM,CAAA,IAAK,EAAA,GAAK,MAAM,CAAA,IAAK,EAAA,IAAM,KAAK,EAAA,GAAK,EAAA;AAAA,EAC3D;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,OAAA,GAAsC;AAAA,MACxC,CAAC,GAAG,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,EAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA,EAAG,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAAA,MACvH,CAAC,GAAG,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,EAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA,EAAG,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC;AAAA,KAC3H;AACA,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,KAAK,OAAA,EAAS;AAChC,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,EAAA,EAAI,MAAA,EAAQ,aAAA,EAAc;AAAA,MACnD;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AClIA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEO,IAAM,kBAAN,MAA0C;AAAA,EAO7C,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,iBAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAClE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,iBAAA,EAAmB,IAAA,CAAK,OAAO,KAAK,CAAA;AAC3D,IAAA,MAAM,YAAA,GAAe,YAAA,CAAa,CAAA,CAAE,WAAA,EAAa,GAAG,CAAA;AAGpD,IAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,KAAK,EAAA,EAAI,EAAA,GAAK,EAAE,CAAA,IAAK,CAAA;AAChD,IAAA,MAAM,KAAA,GAAU,EAAE,EAAA,GAAK,EAAA,CAAA,GAAM,OAAA;AAC7B,IAAA,MAAM,KAAA,GAAA,CAAY,KAAK,EAAA,IAAM,OAAA;AAC7B,IAAA,MAAM,MAAA,GAAU,EAAA;AAEhB,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,YAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAc,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AAGrD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AACrE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,GAAA,CAAI,WAAA,GAAc,YAAA;AAClB,IAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,OAAO,EAAA,GAAK,KAAA,GAAQ,MAAA,EAAQ,EAAA,GAAK,QAAQ,MAAM,CAAA;AACnD,IAAA,GAAA,CAAI,OAAO,EAAA,GAAK,KAAA,GAAQ,MAAA,EAAQ,EAAA,GAAK,QAAQ,MAAM,CAAA;AACnD,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,OAAO,EAAA,GAAK,KAAA,GAAQ,MAAA,EAAQ,EAAA,GAAK,QAAQ,MAAM,CAAA;AACnD,IAAA,GAAA,CAAI,OAAO,EAAA,GAAK,KAAA,GAAQ,MAAA,EAAQ,EAAA,GAAK,QAAQ,MAAM,CAAA;AACnD,IAAA,GAAA,CAAI,MAAA,EAAO;AAEX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,GAAA,CAAI,IAAI,EAAA,EAAI,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAClD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,GAAA,CAAI,IAAI,EAAA,EAAI,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAClD,IAAA,GAAA,CAAI,IAAA,EAAK;AAET,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,OAAOA,qBAAmB,CAAA,EAAG,CAAA,EAAG,IAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA,IAAKD,eAAAA;AAAA,EACvD;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,GAAA,GAAM;AAAA,MACR,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA,EAAE;AAAA,MAC9H,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAAE,KAClI;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AAC/D,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACjIA,IAAMA,eAAAA,GAAgB,CAAA;AACtB,IAAM,WAAA,GAAc,MAAA;AACpB,IAAM,GAAA,GAAM,CAAA;AAEL,IAAM,OAAN,MAA+B;AAAA,EAQlC,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,MAAA;AAGhB,IAAA,IAAA,CAAA,IAAA,GAAe,EAAA;AAIX,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAClE,IAAA,IAAA,CAAK,MAAA,GAAS,CAAC,KAAK,CAAA;AACpB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,MAAM,CAAA,GAAI,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AAClE,IAAA,MAAM,CAAA,GAAI,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAEjE,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,MAAA,EAAQ,IAAA,CAAK,OAAO,KAAK,CAAA;AAChD,IAAA,MAAM,QAAA,GAAW,EAAE,QAAA,IAAY,EAAA;AAC/B,IAAA,MAAM,SAAA,GAAY,EAAE,SAAA,IAAa,SAAA;AAEjC,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,wBAAA,CAAA;AACtB,IAAA,GAAA,CAAI,YAAA,GAAe,KAAA;AAEnB,IAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,IAAQ,WAAA;AAC3B,IAAA,MAAM,aAAA,GAAgB,CAAC,IAAA,CAAK,IAAA;AAC5B,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,WAAA,CAAY,KAAK,CAAA,CAAE,KAAA;AAErC,IAAA,IAAI,UAAA,EAAY;AACZ,MAAA,GAAA,CAAI,WAAA,GAAc,SAAA;AAClB,MAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,MAAA,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,EAAG,CAAA,GAAI,GAAG,KAAA,GAAQ,GAAA,GAAM,CAAA,EAAG,EAAA,GAAK,CAAC,CAAA;AAAA,IACxD;AAEA,IAAA,GAAA,CAAI,SAAA,GAAY,gBAAgB,MAAA,GAAS,SAAA;AACzC,IAAA,GAAA,CAAI,QAAA,CAAS,KAAA,EAAO,CAAA,GAAI,GAAA,EAAK,CAAC,CAAA;AAE9B,IAAA,IAAI,UAAA,EAAY;AACZ,MAAA,GAAA,CAAI,WAAA,GAAc,SAAA;AAClB,MAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAA,GAAI,EAAE,CAAA;AACpB,MAAA,GAAA,CAAI,OAAO,CAAA,GAAI,KAAA,GAAQ,GAAA,GAAM,CAAA,EAAG,IAAI,EAAE,CAAA;AACtC,MAAA,GAAA,CAAI,MAAA,EAAO;AAAA,IACf;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,IAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAElE,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,EAAA,EAAA,CAAK,KAAK,IAAA,EAAM,MAAA,IAAU,KAAK,CAAC,CAAA;AACzD,IAAA,OACI,CAAA,IAAK,EAAA,GAAKA,eAAAA,IACV,CAAA,IAAK,EAAA,GAAK,OAAA,GAAUA,eAAAA,IACpB,CAAA,IAAK,EAAA,GAAKA,eAAAA,IACV,CAAA,IAAK,EAAA,GAAK,EAAA,GAAKA,eAAAA;AAAA,EAEvB;AAAA,EAEA,SAAA,GAAkC;AAC9B,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACzFA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,IAAM,KAAA,GAAQ,EAAA;AACd,IAAM,MAAA,GAAS,CAAA;AACf,IAAM,KAAA,GAAQ,EAAA;AAEd,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEA,SAASK,aAAY,GAAA,EAA+B,CAAA,EAAW,CAAA,EAAW,CAAA,EAAW,GAAW,CAAA,EAAiB;AAC7G,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AACnB,EAAA,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AACvB,EAAA,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,GAAI,GAAG,CAAC,CAAA;AACnC,EAAA,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAI,CAAC,CAAA;AAC3B,EAAA,GAAA,CAAI,KAAA,CAAM,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AAC3C,EAAA,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AACvB,EAAA,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,GAAI,CAAA,EAAG,GAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAC,CAAA;AACnC,EAAA,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AACnB,EAAA,GAAA,CAAI,MAAM,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,GAAG,CAAC,CAAA;AAC3B,EAAA,GAAA,CAAI,SAAA,EAAU;AAClB;AAEO,IAAM,UAAN,MAAkC;AAAA,EAQrC,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,SAAA;AAGhB,IAAA,IAAA,CAAA,IAAA,GAAe,EAAA;AAIX,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAClE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEQ,QAAQ,GAAA,EAAuC;AACnD,IAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,IAAQ,MAAA;AAC3B,IAAA,OAAO,IAAA,CAAK,IAAI,EAAA,EAAI,GAAA,CAAI,YAAY,KAAK,CAAA,CAAE,KAAA,GAAQ,KAAA,GAAQ,CAAC,CAAA;AAAA,EAChE;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,OAAO,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACzD,IAAA,MAAM,OAAO,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACxD,IAAA,MAAM,OAAO,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACzD,IAAA,MAAM,OAAO,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAExD,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,SAAA,EAAW,IAAA,CAAK,OAAO,KAAK,CAAA;AACnD,IAAA,MAAM,QAAA,GAAW,EAAE,QAAA,IAAY,EAAA;AAC/B,IAAA,MAAM,SAAA,GAAY,EAAE,SAAA,IAAa,SAAA;AAEjC,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,wBAAA,CAAA;AACtB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAErE,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC7B,IAAA,MAAM,EAAA,GAAK,OAAO,IAAA,GAAO,CAAA;AACzB,IAAA,MAAM,EAAA,GAAK,OAAO,KAAA,GAAQ,CAAA;AAG1B,IAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,GAAA,CAAI,EAAA,GAAK,IAAA,EAAM,IAAI,CAAC,CAAA;AACvD,IAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,GAAA,CAAI,EAAA,GAAK,KAAA,EAAO,IAAI,CAAC,CAAA;AACxD,IAAA,MAAM,KAAA,GAAQ,OAAO,EAAA,GAAK,EAAA,GAAK,OAAO,EAAA,GAAK,IAAA,GAAO,KAAK,IAAA,GAAO,QAAA;AAC9D,IAAA,MAAM,KAAA,GAAQ,OAAO,EAAA,GAAK,EAAA,GAAK,OAAO,EAAA,GAAK,KAAA,GAAQ,KAAK,KAAA,GAAQ,QAAA;AAGhE,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,OAAO,KAAK,CAAA;AACvB,IAAA,GAAA,CAAI,MAAA,CAAO,MAAM,IAAI,CAAA;AACrB,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,IAAI,IAAA,EAAM,IAAA,EAAM,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACrC,IAAA,GAAA,CAAI,IAAA,EAAK;AAGT,IAAAA,aAAY,GAAA,EAAK,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,OAAO,MAAM,CAAA;AAC5C,IAAA,GAAA,CAAI,SAAA,GAAY,YAAA,CAAa,CAAA,CAAE,SAAA,EAAW,EAAE,WAAW,CAAA;AACvD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,IAAQ,MAAA;AAC3B,IAAA,MAAM,aAAA,GAAgB,CAAC,IAAA,CAAK,IAAA;AAC5B,IAAA,GAAA,CAAI,SAAA,GAAY,gBAAgB,MAAA,GAAS,SAAA;AACzC,IAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AACnB,IAAA,GAAA,CAAI,SAAA,GAAY,QAAA;AAChB,IAAA,GAAA,CAAI,QAAA,CAAS,KAAA,EAAO,IAAA,EAAM,IAAI,CAAA;AAE9B,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,OAAO,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACzD,IAAA,MAAM,OAAO,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACxD,IAAA,MAAM,OAAO,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACzD,IAAA,MAAM,OAAO,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACxD,IAAA,MAAM,UAAA,GAAa,KAAK,GAAA,CAAI,EAAA,EAAA,CAAK,KAAK,IAAA,EAAM,MAAA,IAAU,CAAA,IAAK,CAAA,GAAI,EAAE,CAAA;AACjE,IAAA,MAAM,EAAA,GAAK,OAAO,UAAA,GAAa,CAAA;AAC/B,IAAA,MAAM,EAAA,GAAK,OAAO,KAAA,GAAQ,CAAA;AAG1B,IAAA,IAAI,CAAA,IAAK,EAAA,GAAKN,eAAAA,IAAiB,CAAA,IAAK,EAAA,GAAK,UAAA,GAAaA,eAAAA,IAClD,CAAA,IAAK,EAAA,GAAKA,eAAAA,IAAiB,CAAA,IAAK,EAAA,GAAK,QAAQA,eAAAA,EAAe;AAC5D,MAAA,OAAO,IAAA;AAAA,IACX;AAGA,IAAA,MAAM,QAAQ,IAAA,GAAO,EAAA,GAAK,EAAA,GAAK,IAAA,GAAO,KAAK,UAAA,GAAa,EAAA,GAAK,UAAA,GAAa,IAAA,CAAK,IAAI,EAAA,EAAI,IAAA,CAAK,IAAI,EAAA,GAAK,UAAA,EAAY,IAAI,CAAC,CAAA;AACtH,IAAA,MAAM,QAAQ,IAAA,GAAO,EAAA,GAAK,EAAA,GAAK,IAAA,GAAO,KAAK,KAAA,GAAQ,EAAA,GAAK,KAAA,GAAQ,IAAA,CAAK,IAAI,EAAA,EAAI,IAAA,CAAK,IAAI,EAAA,GAAK,KAAA,EAAO,IAAI,CAAC,CAAA;AAGvG,IAAA,IAAIC,oBAAAA,CAAmB,GAAG,CAAA,EAAG,KAAA,EAAO,OAAO,IAAA,EAAM,IAAI,KAAKD,eAAAA,EAAe;AACrE,MAAA,OAAO,IAAA;AAAA,IACX;AAEA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,GAAA,GAAM;AAAA,MACR,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA,EAAE;AAAA,MAC9H,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAAE,KAClI;AACA,IAAA,MAAM,OAAA,GAAoB,CAAC,MAAA,EAAQ,MAAM,CAAA;AACzC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AAC/D,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,OAAA,CAAQ,CAAC,CAAA,EAAE;AAAA,MAC/C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AChLA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,IAAM,OAAA,GAAU,EAAA;AAChB,IAAMO,QAAAA,GAAU,EAAA;AAChB,IAAM,OAAA,GAAU,CAAA;AAET,IAAM,aAAN,MAAqC;AAAA,EAOxC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,YAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,MAAA,GAAS,CAAC,KAAK,CAAA;AACpB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,GAAA,EACA,KAAA,EACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACA,UAAA,EACA,cAAA,GAAiB,CAAA,EACjB,KAAA,EACI;AACJ,IAAA,MAAM,CAAA,GAAI,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AAClE,IAAA,MAAM,CAAA,GAAI,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AACjE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA;AAE7B,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,YAAA,EAAc,IAAA,CAAK,OAAO,KAAK,CAAA;AACtD,IAAA,MAAM,QAAA,GAAW,EAAE,QAAA,IAAY,EAAA;AAC/B,IAAA,MAAM,SAAA,GAAY,EAAE,SAAA,IAAa,SAAA;AAEjC,IAAA,GAAA,CAAI,IAAA,EAAK;AAGT,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,SAAA;AAClB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AACf,IAAA,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,OAAA,EAAS,CAAA,GAAIA,WAAU,CAAC,CAAA;AACvC,IAAA,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,OAAA,EAAS,CAAA,GAAIA,WAAU,CAAC,CAAA;AACvC,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,IAAA,EAAK;AAGT,IAAA,MAAM,KAAK,CAAA,GAAI,OAAA;AACf,IAAA,MAAM,EAAA,GAAK,IAAIA,QAAAA,GAAU,CAAA;AACzB,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,SAAA;AAClB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,UAAU,EAAA,EAAI,EAAA,EAAI,OAAA,EAASA,QAAAA,EAASA,WAAU,CAAC,CAAA;AACnD,IAAA,GAAA,CAAI,IAAA,EAAK;AAGT,IAAA,IAAI,UAAA,EAAY;AACZ,MAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,MAAA,GAAA,CAAI,SAAA,GAAY,EAAE,SAAA,GAAY,GAAA;AAC9B,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,SAAA,CAAU,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,OAAA,GAAU,CAAA,EAAGA,QAAAA,GAAU,CAAA,EAAGA,QAAAA,GAAU,CAAA,GAAI,CAAC,CAAA;AACvE,MAAA,GAAA,CAAI,MAAA,EAAO;AAAA,IACf;AAGA,IAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,iCAAA,CAAA;AACtB,IAAA,GAAA,CAAI,SAAA,GAAY,SAAA;AAChB,IAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AACnB,IAAA,GAAA,CAAI,SAAA,GAAY,QAAA;AAChB,IAAA,GAAA,CAAI,QAAA,CAAS,MAAM,OAAA,CAAQ,cAAc,GAAG,EAAA,GAAK,OAAA,GAAU,GAAG,CAAC,CAAA;AAE/D,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,IAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAClE,IAAA,MAAM,KAAK,EAAA,GAAK,OAAA;AAChB,IAAA,MAAM,EAAA,GAAK,KAAKA,QAAAA,GAAU,CAAA;AAC1B,IAAA,OACI,CAAA,IAAK,EAAA,GAAKP,eAAAA,IACV,CAAA,IAAK,EAAA,GAAK,OAAA,GAAUA,eAAAA,IACpB,CAAA,IAAK,EAAA,GAAKA,eAAAA,IACV,CAAA,IAAK,EAAA,GAAKO,QAAAA,GAAUP,eAAAA;AAAA,EAE5B;AAAA,EAEA,SAAA,GAAkC;AAC9B,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACpGA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEO,IAAM,cAAN,MAAsC;AAAA,EAOzC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,aAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAClE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,aAAA,EAAe,IAAA,CAAK,OAAO,KAAK,CAAA;AAEvD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,YAAA,CAAa,CAAA,CAAE,SAAA,EAAW,EAAE,WAAW,CAAA;AACvD,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAGrE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACzC,IAAA,MAAM,IAAA,GAAO,EAAA;AACb,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,OAAO,EAAA,GAAK,IAAA,GAAO,KAAK,GAAA,CAAI,KAAA,GAAQ,KAAK,EAAA,GAAK,CAAC,CAAA,EAAG,EAAA,GAAK,OAAO,IAAA,CAAK,GAAA,CAAI,QAAQ,IAAA,CAAK,EAAA,GAAK,CAAC,CAAC,CAAA;AAC/F,IAAA,GAAA,CAAI,OAAO,EAAA,GAAK,IAAA,GAAO,KAAK,GAAA,CAAI,KAAA,GAAQ,KAAK,EAAA,GAAK,CAAC,CAAA,EAAG,EAAA,GAAK,OAAO,IAAA,CAAK,GAAA,CAAI,QAAQ,IAAA,CAAK,EAAA,GAAK,CAAC,CAAC,CAAA;AAC/F,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,IAAA,EAAK;AAGT,IAAA,IAAI,UAAA,EAAY;AACZ,MAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,CAAA,IAAK,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA,EAAyB;AAC/D,QAAA,GAAA,CAAI,SAAA,EAAU;AACd,QAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACjC,QAAA,GAAA,CAAI,IAAA,EAAK;AAAA,MACb;AAAA,IACJ;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,OAAOA,qBAAmB,CAAA,EAAG,CAAA,EAAG,IAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA,IAAKD,eAAAA;AAAA,EACvD;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,GAAA,GAAM;AAAA,MACR,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA,EAAE;AAAA,MAC9H,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAAE,KAClI;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AAC/D,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACrHO,IAAM,OAAN,MAA+B;AAAA,EAOlC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,MAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,MAAA,GAAS,CAAC,KAAK,CAAA;AACpB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,MAAM,CAAA,GAAI,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AAClE,IAAA,MAAM,CAAA,GAAI,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAEjE,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,MAAA,EAAQ,IAAA,CAAK,OAAO,KAAK,CAAA;AAEhD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAGrE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAA,GAAI,EAAE,CAAA;AACpB,IAAA,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAA,GAAI,EAAE,CAAA;AACpB,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,MAAM,KAAA,GAAQ,CAAA;AACd,IAAA,MAAM,QAAQ,CAAA,GAAI,EAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAY,YAAA,CAAa,CAAA,CAAE,SAAA,EAAW,EAAE,WAAW,CAAA;AACvD,IAAA,GAAA,CAAI,QAAA,CAAS,KAAA,EAAO,KAAA,EAAO,EAAA,EAAI,EAAE,CAAA;AAGjC,IAAA,GAAA,CAAI,IAAA,GAAO,2BAAA;AACX,IAAA,GAAA,CAAI,SAAA,GAAY,SAAA;AAChB,IAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AACnB,IAAA,GAAA,CAAI,SAAA,GAAY,QAAA;AAChB,IAAA,GAAA,CAAI,QAAA,CAAS,GAAA,EAAK,KAAA,GAAQ,CAAA,EAAG,QAAQ,CAAC,CAAA;AAEtC,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,IAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAClE,IAAA,OAAO,KAAK,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,EAAE,CAAA,IAAK,EAAA;AAAA,EACzC;AAAA,EAEA,SAAA,GAAkC;AAC9B,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC5EA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,IAAMO,QAAAA,GAAU,EAAA;AAChB,IAAM,eAAA,GAAkB,CAAA;AACxB,IAAM,SAAA,GAAY,EAAA;AAEX,IAAM,YAAN,MAAoC;AAAA,EAOvC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,WAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACpE,IAAA,IAAA,CAAK,MAAA,GAAS,CAAC,KAAK,CAAA;AACpB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,GAAA,EACA,KAAA,EACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACA,UAAA,EACA,cAAA,GAAiB,CAAA,EACjB,KAAA,EACI;AACJ,IAAA,MAAM,CAAA,GAAI,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AAClE,IAAA,MAAM,CAAA,GAAI,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AACjE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,cAAc,CAAA;AAE1C,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,WAAA,EAAa,IAAA,CAAK,OAAO,KAAK,CAAA;AACrD,IAAA,MAAM,QAAA,GAAW,EAAE,QAAA,IAAY,EAAA;AAC/B,IAAA,MAAM,SAAA,GAAY,EAAE,SAAA,IAAa,SAAA;AAEjC,IAAA,GAAA,CAAI,IAAA,EAAK;AAGT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AACrE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,SAAA,EAAW,CAAC,CAAA;AAC3B,IAAA,GAAA,CAAI,MAAA,CAAO,CAAA,GAAI,SAAA,EAAW,CAAC,CAAA;AAC3B,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,iCAAA,CAAA;AACtB,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,WAAA,CAAY,KAAK,CAAA,CAAE,KAAA;AAClC,IAAA,MAAM,MAAA,GAAS,KAAK,eAAA,GAAkB,CAAA;AAGtC,IAAA,MAAM,EAAA,GAAK,IAAI,SAAA,GAAY,CAAA;AAC3B,IAAA,MAAM,EAAA,GAAK,IAAIA,QAAAA,GAAU,CAAA;AACzB,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,SAAA;AAClB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,SAAA,CAAU,EAAA,EAAI,EAAA,EAAI,MAAA,EAAQA,UAAS,CAAC,CAAA;AACxC,IAAA,GAAA,CAAI,IAAA,EAAK;AAGT,IAAA,GAAA,CAAI,SAAA,GAAY,SAAA;AAChB,IAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AACnB,IAAA,GAAA,CAAI,SAAA,GAAY,QAAA;AAChB,IAAA,GAAA,CAAI,QAAA,CAAS,KAAA,EAAO,EAAA,GAAK,MAAA,GAAS,GAAG,CAAC,CAAA;AAEtC,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,IAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAElE,IAAA,OACI,CAAA,IAAK,EAAA,GAAK,SAAA,GAAYP,eAAAA,IACtB,CAAA,IAAK,EAAA,GAAK,SAAA,GAAYA,eAAAA,IACtB,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,EAAE,CAAA,IAAKA,eAAAA;AAAA,EAE5B;AAAA,EAEA,SAAA,GAAkC;AAC9B,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC/FA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,IAAMO,QAAAA,GAAU,EAAA;AAChB,IAAMC,MAAAA,GAAQ,EAAA;AAEd,SAASP,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEO,IAAM,eAAN,MAAuC;AAAA,EAQ1C,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,cAAA;AAGhB,IAAA,IAAA,CAAA,IAAA,GAAe,EAAA;AAIX,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACpE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEQ,UAAU,GAAA,EAAuC;AACrD,IAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,IAAQ,MAAA;AAC3B,IAAA,OAAO,IAAA,CAAK,IAAI,EAAA,EAAI,GAAA,CAAI,YAAY,KAAK,CAAA,CAAE,KAAA,GAAQO,MAAAA,GAAQ,CAAC,CAAA;AAAA,EAChE;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,cAAA,EAAgB,IAAA,CAAK,OAAO,KAAK,CAAA;AACxD,IAAA,MAAM,QAAA,GAAW,EAAE,QAAA,IAAY,EAAA;AAC/B,IAAA,MAAM,SAAA,GAAY,EAAE,SAAA,IAAa,SAAA;AAEjC,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,IAAA,GAAO,GAAG,QAAQ,CAAA,wBAAA,CAAA;AACtB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AAEnD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AACjC,IAAA,MAAM,EAAA,GAAK,KAAK,MAAA,GAAS,CAAA;AACzB,IAAA,MAAM,EAAA,GAAK,KAAKD,QAAAA,GAAU,CAAA;AAG1B,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACjC,IAAA,GAAA,CAAI,IAAA,EAAK;AAGT,IAAA,GAAA,CAAI,SAAA,GAAY,YAAA,CAAa,CAAA,CAAE,SAAA,EAAW,EAAE,WAAW,CAAA;AACvD,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,SAAA,CAAU,EAAA,EAAI,EAAA,EAAI,MAAA,EAAQA,UAAS,CAAC,CAAA;AACxC,IAAA,GAAA,CAAI,IAAA,EAAK;AAGT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,SAAA,CAAU,EAAA,EAAI,EAAA,EAAI,MAAA,EAAQA,UAAS,CAAC,CAAA;AACxC,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,IAAQ,MAAA;AAC3B,IAAA,MAAM,aAAA,GAAgB,CAAC,IAAA,CAAK,IAAA;AAC5B,IAAA,GAAA,CAAI,SAAA,GAAY,gBAAgB,MAAA,GAAS,SAAA;AACzC,IAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AACnB,IAAA,GAAA,CAAI,SAAA,GAAY,QAAA;AAChB,IAAA,GAAA,CAAI,QAAA,CAAS,KAAA,EAAO,EAAA,EAAI,EAAE,CAAA;AAE1B,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,YAAA,GAAe,KAAK,GAAA,CAAI,EAAA,EAAA,CAAK,KAAK,IAAA,EAAM,MAAA,IAAU,CAAA,IAAK,CAAA,GAAI,EAAE,CAAA;AACnE,IAAA,MAAM,EAAA,GAAK,KAAK,YAAA,GAAe,CAAA;AAC/B,IAAA,MAAM,EAAA,GAAK,KAAKA,QAAAA,GAAU,CAAA;AAG1B,IAAA,IAAI,CAAA,IAAK,EAAA,GAAKP,eAAAA,IAAiB,CAAA,IAAK,EAAA,GAAK,YAAA,GAAeA,eAAAA,IACpD,CAAA,IAAK,EAAA,GAAKA,eAAAA,IAAiB,CAAA,IAAK,EAAA,GAAKO,WAAUP,eAAAA,EAAe;AAC9D,MAAA,OAAO,IAAA;AAAA,IACX;AAGA,IAAA,IAAIC,oBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,EAAI,IAAI,EAAA,EAAI,EAAE,KAAKD,eAAAA,EAAe;AAC3D,MAAA,OAAO,IAAA;AAAA,IACX;AAEA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,GAAA,GAAM;AAAA,MACR,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA,EAAE;AAAA,MAC9H,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAAE,KAClI;AACA,IAAA,MAAM,OAAA,GAAoB,CAAC,MAAA,EAAQ,MAAM,CAAA;AACzC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AAC/D,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,OAAA,CAAQ,CAAC,CAAA,EAAE;AAAA,MAC/C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC3JO,IAAM,UAAN,MAAkC;AAAA,EAOrC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,SAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,MAAA,GAAS,CAAC,KAAK,CAAA;AACpB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,MAAM,CAAA,GAAI,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AAClE,IAAA,MAAM,CAAA,GAAI,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAEjE,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,SAAA,EAAW,IAAA,CAAK,OAAO,KAAK,CAAA;AAEnD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,YAAA,CAAa,CAAA,CAAE,SAAA,EAAW,EAAE,WAAW,CAAA;AACvD,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAGrE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAA,GAAI,EAAE,CAAA;AACpB,IAAA,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AACnB,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,MAAM,IAAA,GAAO,CAAA;AACb,IAAA,MAAM,OAAO,CAAA,GAAI,EAAA;AACjB,IAAA,MAAM,QAAA,GAAW,CAAA;AACjB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,MAAM,IAAI,CAAA;AACrB,IAAA,GAAA,CAAI,MAAA,CAAO,IAAA,GAAO,QAAA,EAAU,IAAA,GAAO,EAAE,CAAA;AACrC,IAAA,GAAA,CAAI,MAAA,CAAO,IAAA,GAAO,QAAA,EAAU,IAAA,GAAO,EAAE,CAAA;AACrC,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,IAAA,EAAK;AAET,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,IAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAClE,IAAA,OAAO,KAAK,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,EAAE,CAAA,IAAK,EAAA;AAAA,EACzC;AAAA,EAEA,SAAA,GAAkC;AAC9B,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACzEO,IAAM,YAAN,MAAoC;AAAA,EAOvC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,WAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,MAAA,GAAS,CAAC,KAAK,CAAA;AACpB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,MAAM,CAAA,GAAI,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AAClE,IAAA,MAAM,CAAA,GAAI,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAEjE,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,WAAA,EAAa,IAAA,CAAK,OAAO,KAAK,CAAA;AAErD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,YAAA,CAAa,CAAA,CAAE,SAAA,EAAW,EAAE,WAAW,CAAA;AACvD,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAGrE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAA,GAAI,EAAE,CAAA;AACpB,IAAA,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA;AACnB,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,MAAM,IAAA,GAAO,CAAA;AACb,IAAA,MAAM,OAAO,CAAA,GAAI,EAAA;AACjB,IAAA,MAAM,QAAA,GAAW,CAAA;AACjB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,MAAM,IAAI,CAAA;AACrB,IAAA,GAAA,CAAI,MAAA,CAAO,IAAA,GAAO,QAAA,EAAU,IAAA,GAAO,EAAE,CAAA;AACrC,IAAA,GAAA,CAAI,MAAA,CAAO,IAAA,GAAO,QAAA,EAAU,IAAA,GAAO,EAAE,CAAA;AACrC,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,IAAA,EAAK;AAET,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,IAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAClE,IAAA,OAAO,KAAK,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,EAAE,CAAA,IAAK,EAAA;AAAA,EACzC;AAAA,EAEA,SAAA,GAAkC;AAC9B,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC1EA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEO,IAAM,gBAAN,MAAwC;AAAA,EAQ3C,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,eAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,GAAA,EAAM,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACjE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAI5B,IAAA,MAAM,SAAS,CAAC,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,MAAM,IAAI,CAAA;AAC3C,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AAEb,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,eAAA,EAAiB,IAAA,CAAK,OAAO,KAAK,CAAA;AAEzD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAKrE,IAAA,MAAM,cAAc,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAClC,IAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,MAAA,CAAO,CAAA,CAAA,KAAK,IAAI,CAAC,CAAA;AAErD,IAAA,IAAI,eAAA,CAAgB,UAAU,CAAA,EAAG;AAC7B,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,EAAA,CAAG,eAAA,CAAgB,CAAC,CAAC,GAAG,EAAA,CAAG,eAAA,CAAgB,CAAC,CAAC,CAAC,CAAA;AACzD,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,eAAA,CAAgB,QAAQ,CAAA,EAAA,EAAK;AAC7C,QAAA,GAAA,CAAI,MAAA,CAAO,EAAA,CAAG,eAAA,CAAgB,CAAC,CAAC,GAAG,EAAA,CAAG,eAAA,CAAgB,CAAC,CAAC,CAAC,CAAA;AAAA,MAC7D;AACA,MAAA,GAAA,CAAI,MAAA,EAAO;AAAA,IACf;AACA,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,CAAA,KAAM,CAAA,EAAG;AAC1B,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,SAAA,GAAY,YAAA,CAAa,CAAA,CAAE,SAAA,EAAW,EAAE,WAAW,CAAA;AACvD,MAAA,GAAA,CAAI,IAAA,EAAK;AAAA,IACb;AAGA,IAAA,IAAI,KAAK,CAAA,EAAG;AACR,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,MAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,IAChB;AAGA,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,UAAA,GAAa,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACxD,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,IAAK,OAAO,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,GAAI,CAAA,EAAG,EAAA,CAAG,CAAC,IAAI,CAAC,CAAA;AAAA,IAC7D;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AAGb,IAAA,MAAM,cAAc,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAClC,IAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,MAAA,CAAO,CAAA,CAAA,KAAK,IAAI,CAAC,CAAA;AACrD,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,eAAA,CAAgB,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACjD,MAAA,MAAM,CAAA,GAAI,gBAAgB,CAAC,CAAA;AAC3B,MAAA,MAAM,CAAA,GAAI,eAAA,CAAgB,CAAA,GAAI,CAAC,CAAA;AAC/B,MAAA,IAAIA,qBAAmB,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,CAAC,GAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA,IAAKD,iBAAe,OAAO,IAAA;AAAA,IACtF;AAGA,IAAA,IAAI,KAAK,CAAA,IAAKC,oBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA,IAAKD,iBAAe,OAAO,IAAA;AAE5F,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,IAAA,CAAK,gBAAgB,OAAO,IAAA;AACvD,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAClE,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC1JA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEO,IAAM,kBAAN,MAA0C;AAAA,EAQ7C,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,iBAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAG5B,IAAA,MAAM,SAAS,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AACvC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AAEb,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,iBAAA,EAAmB,IAAA,CAAK,OAAO,KAAK,CAAA;AAE3D,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAGrE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,IAC3B;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,IAAI,KAAK,CAAA,EAAG;AACR,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,MAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,IAAI,CAAA,IAAK,GAAG,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACnC,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,IAChB;AAGA,IAAA,IAAI,KAAK,CAAA,EAAG;AACR,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,MAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,IAChB;AAGA,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,UAAA,GAAa,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACxD,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,IAAK,OAAO,CAAA,GAAI,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,GAAI,CAAA,EAAG,EAAA,CAAG,CAAC,IAAI,CAAC,CAAA;AAAA,IACjE;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AAGb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AAC5B,MAAA,IAAIA,qBAAmB,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAA,GAAI,CAAC,GAAG,EAAA,CAAG,CAAA,GAAI,CAAC,CAAC,CAAA,IAAKD,iBAAe,OAAO,IAAA;AAAA,IAC9F;AAGA,IAAA,IAAI,KAAK,CAAA,IAAKC,oBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA,IAAKD,iBAAe,OAAO,IAAA;AAC5F,IAAA,IAAI,KAAK,CAAA,IAAKC,oBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA,IAAKD,iBAAe,OAAO,IAAA;AAG5F,IAAA,IAAI,KAAK,CAAA,IAAKC,oBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA,IAAKD,iBAAe,OAAO,IAAA;AAE5F,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,IAAA,CAAK,gBAAgB,OAAO,IAAA;AACvD,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAClE,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACnJA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEO,IAAM,cAAN,MAAsC;AAAA,EAQzC,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,aAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,GAAA,EAAM,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACjE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAG5B,IAAA,MAAM,MAAA,GAAS,CAAC,GAAA,EAAK,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AACjD,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AAEb,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,aAAA,EAAe,IAAA,CAAK,OAAO,KAAK,CAAA;AAEvD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAGrE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,IAC3B;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,CAAA,KAAM,CAAA,EAAG;AAC1B,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,QAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,MAC3B;AACA,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,SAAA,GAAY,YAAA,CAAa,CAAA,CAAE,SAAA,EAAW,EAAE,WAAW,CAAA;AACvD,MAAA,GAAA,CAAI,IAAA,EAAK;AAAA,IACb;AAGA,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,UAAA,GAAa,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACxD,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,IAAK,OAAO,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,GAAI,CAAA,EAAG,EAAA,CAAG,CAAC,IAAI,CAAC,CAAA;AAAA,IAC7D;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AAEb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AAC5B,MAAA,IAAIA,qBAAmB,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAA,GAAI,CAAC,GAAG,EAAA,CAAG,CAAA,GAAI,CAAC,CAAC,CAAA,IAAKD,iBAAe,OAAO,IAAA;AAAA,IAC9F;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,IAAA,CAAK,gBAAgB,OAAO,IAAA;AACvD,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAClE,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC3HA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEO,IAAM,cAAN,MAAsC;AAAA,EAQzC,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,aAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,MAAA,GAAS,CAAC,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AAClC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AAEb,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,aAAA,EAAe,IAAA,CAAK,OAAO,KAAK,CAAA;AAEvD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAGrE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,IAC3B;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,IAAI,KAAK,CAAA,EAAG;AACR,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,MAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,IAChB;AAGA,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,UAAA,GAAa,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACxD,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,IAAK,OAAO,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,GAAI,CAAA,EAAG,EAAA,CAAG,CAAC,IAAI,CAAC,CAAA;AAAA,IAC7D;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AAEb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AAC5B,MAAA,IAAIA,qBAAmB,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAA,GAAI,CAAC,GAAG,EAAA,CAAG,CAAA,GAAI,CAAC,CAAC,CAAA,IAAKD,iBAAe,OAAO,IAAA;AAAA,IAC9F;AAGA,IAAA,IAAI,KAAK,CAAA,IAAKC,oBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA,IAAKD,iBAAe,OAAO,IAAA;AAE5F,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,IAAA,CAAK,gBAAgB,OAAO,IAAA;AACvD,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAClE,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC/HA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEO,IAAM,gBAAN,MAAwC;AAAA,EAQ3C,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,eAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAClE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,SAAS,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AACvC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AAEb,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,eAAA,EAAiB,IAAA,CAAK,OAAO,KAAK,CAAA;AAEzD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAGrE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,IAC3B;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,CAAA,KAAM,CAAA,EAAG;AAC1B,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,QAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,MAC3B;AACA,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,SAAA,GAAY,YAAA,CAAa,CAAA,CAAE,SAAA,EAAW,EAAE,WAAW,CAAA;AACvD,MAAA,GAAA,CAAI,IAAA,EAAK;AAAA,IACb;AAGA,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,UAAA,GAAa,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACxD,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,IAAK,OAAO,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,GAAI,CAAA,EAAG,EAAA,CAAG,CAAC,IAAI,CAAC,CAAA;AAAA,IAC7D;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AAEb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AAC5B,MAAA,IAAIA,qBAAmB,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAA,GAAI,CAAC,GAAG,EAAA,CAAG,CAAA,GAAI,CAAC,CAAC,CAAA,IAAKD,iBAAe,OAAO,IAAA;AAAA,IAC9F;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,IAAA,CAAK,gBAAgB,OAAO,IAAA;AACvD,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAClE,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC1HA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEO,IAAM,mBAAN,MAA2C;AAAA,EAQ9C,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,kBAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,SAAS,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AACvC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AAEb,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,kBAAA,EAAoB,IAAA,CAAK,OAAO,KAAK,CAAA;AAE5D,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAGrE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,IAC3B;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,IAAI,KAAK,CAAA,EAAG;AACR,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,MAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,IAChB;AAGA,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,UAAA,GAAa,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACxD,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,IAAK,OAAO,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,GAAI,CAAA,EAAG,EAAA,CAAG,CAAC,IAAI,CAAC,CAAA;AAAA,IAC7D;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AAEb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AAC5B,MAAA,IAAIA,qBAAmB,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAA,GAAI,CAAC,GAAG,EAAA,CAAG,CAAA,GAAI,CAAC,CAAC,CAAA,IAAKD,iBAAe,OAAO,IAAA;AAAA,IAC9F;AAGA,IAAA,IAAI,KAAK,CAAA,IAAKC,oBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA,IAAKD,iBAAe,OAAO,IAAA;AAE5F,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,IAAA,CAAK,gBAAgB,OAAO,IAAA;AACvD,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAClE,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC/HA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEO,IAAM,aAAN,MAAqC;AAAA,EAQxC,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,YAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAClE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,SAAS,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AACvC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AAEb,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,YAAA,EAAc,IAAA,CAAK,OAAO,KAAK,CAAA;AAEtD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAGrE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,IAC3B;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,IAAI,KAAK,CAAA,EAAG;AACR,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,MAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,IAChB;AAGA,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,UAAA,GAAa,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACxD,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,IAAK,OAAO,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,GAAI,CAAA,EAAG,EAAA,CAAG,CAAC,IAAI,CAAC,CAAA;AAAA,IAC7D;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AAEb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AAC5B,MAAA,IAAIA,qBAAmB,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAA,GAAI,CAAC,GAAG,EAAA,CAAG,CAAA,GAAI,CAAC,CAAC,CAAA,IAAKD,iBAAe,OAAO,IAAA;AAAA,IAC9F;AAGA,IAAA,IAAI,KAAK,CAAA,IAAKC,oBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA,IAAKD,iBAAe,OAAO,IAAA;AAE5F,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,IAAA,CAAK,gBAAgB,OAAO,IAAA;AACvD,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAClE,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC/HA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEO,IAAM,iBAAN,MAAyC;AAAA,EAQ5C,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,gBAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,SAAS,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AACvC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AAEb,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,gBAAA,EAAkB,IAAA,CAAK,OAAO,KAAK,CAAA;AAE1D,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAGrE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,IAC3B;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,IAAI,KAAK,CAAA,EAAG;AACR,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,MAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,IAChB;AAGA,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,UAAA,GAAa,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACxD,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,IAAK,OAAO,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,GAAI,CAAA,EAAG,EAAA,CAAG,CAAC,IAAI,CAAC,CAAA;AAAA,IAC7D;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AAEb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AAC5B,MAAA,IAAIA,qBAAmB,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAA,GAAI,CAAC,GAAG,EAAA,CAAG,CAAA,GAAI,CAAC,CAAC,CAAA,IAAKD,iBAAe,OAAO,IAAA;AAAA,IAC9F;AAGA,IAAA,IAAI,KAAK,CAAA,IAAKC,oBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA,IAAKD,iBAAe,OAAO,IAAA;AAE5F,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,IAAA,CAAK,gBAAgB,OAAO,IAAA;AACvD,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAClE,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC/HA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEO,IAAM,cAAN,MAAsC;AAAA,EAQzC,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,aAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,SAAS,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AACvC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AAEb,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,aAAA,EAAe,IAAA,CAAK,OAAO,KAAK,CAAA;AAEvD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAGrE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,IAC3B;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,IAAI,KAAK,CAAA,EAAG;AACR,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,MAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,IAChB;AAGA,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,UAAA,GAAa,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACxD,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,IAAK,OAAO,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,GAAI,CAAA,EAAG,EAAA,CAAG,CAAC,IAAI,CAAC,CAAA;AAAA,IAC7D;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AAEb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AAC5B,MAAA,IAAIA,qBAAmB,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAA,GAAI,CAAC,GAAG,EAAA,CAAG,CAAA,GAAI,CAAC,CAAC,CAAA,IAAKD,iBAAe,OAAO,IAAA;AAAA,IAC9F;AAGA,IAAA,IAAI,KAAK,CAAA,IAAKC,oBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA,IAAKD,iBAAe,OAAO,IAAA;AAE5F,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,IAAA,CAAK,gBAAgB,OAAO,IAAA;AACvD,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAClE,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC/HA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEO,IAAM,eAAN,MAAuC;AAAA,EAQ1C,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,cAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,SAAS,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AACvC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AAEb,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,cAAA,EAAgB,IAAA,CAAK,OAAO,KAAK,CAAA;AAExD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAGrE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,IAC3B;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,IAAI,KAAK,CAAA,EAAG;AACR,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,MAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,IAChB;AAGA,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,UAAA,GAAa,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACxD,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,IAAK,OAAO,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,GAAI,CAAA,EAAG,EAAA,CAAG,CAAC,IAAI,CAAC,CAAA;AAAA,IAC7D;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AAEb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AAC5B,MAAA,IAAIA,qBAAmB,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAA,GAAI,CAAC,GAAG,EAAA,CAAG,CAAA,GAAI,CAAC,CAAC,CAAA,IAAKD,iBAAe,OAAO,IAAA;AAAA,IAC9F;AAGA,IAAA,IAAI,KAAK,CAAA,IAAKC,oBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA,IAAKD,iBAAe,OAAO,IAAA;AAE5F,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,IAAA,CAAK,gBAAgB,OAAO,IAAA;AACvD,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAClE,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC/HA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEA,IAAM,SAAS,CAAC,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AAErC,IAAM,iBAAN,MAAyC;AAAA,EAQ5C,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,gBAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AAEb,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,gBAAA,EAAkB,IAAA,CAAK,OAAO,KAAK,CAAA;AAE1D,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAGrE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AAC5B,MAAA,MAAM,SAAA,GAAY,IAAI,CAAA,KAAM,CAAA;AAC5B,MAAA,GAAA,CAAI,cAAc,SAAA,GAAY,CAAA,CAAE,cAAc,YAAA,CAAa,CAAA,CAAE,aAAa,IAAI,CAAA;AAC9E,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,GAAI,CAAC,GAAG,EAAA,CAAG,CAAA,GAAI,CAAC,CAAC,CAAA;AAC/B,MAAA,GAAA,CAAI,MAAA,EAAO;AAAA,IACf;AACA,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,UAAA,GAAa,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACxD,MAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,MAAA,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,IAAK,OAAO,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,GAAI,CAAA,EAAG,EAAA,CAAG,CAAC,IAAI,CAAC,CAAA;AAAA,IAC7D;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACpC,MAAA,IAAIA,qBAAmB,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAA,GAAI,CAAC,GAAG,EAAA,CAAG,CAAA,GAAI,CAAC,CAAC,CAAA,IAAKD,iBAAe,OAAO,IAAA;AAAA,IAC9F;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAU,OAAO,IAAA;AAC3B,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAClE,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,eAAAA,GAAgB,CAAA,EAAG,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,QAAQ,MAAA,EAAO;AAAA,IAChG;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC7GA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEA,IAAMQ,OAAAA,GAAS,CAAC,GAAA,EAAK,GAAA,EAAK,KAAK,GAAG,CAAA;AAE3B,IAAM,oBAAN,MAA4C;AAAA,EAQ/C,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,mBAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAE3E,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,mBAAA,EAAqB,IAAA,CAAK,OAAO,KAAK,CAAA;AAE7D,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AACrE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,MAAA,EAAQ,CAAA,EAAA,EAAK,GAAA,CAAI,MAAA,CAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAC3D,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAElB,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,QAAQ,CAAA,EAAA,EAAK;AAChC,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,UAAA,GAAa,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACxD,MAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,MAAA,GAAA,CAAI,QAAA,CAASA,OAAAA,CAAO,CAAC,CAAA,IAAK,OAAO,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,GAAI,CAAA,EAAG,EAAA,CAAG,CAAC,IAAI,CAAC,CAAA;AAAA,IAC7D;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACpC,MAAA,IAAIR,qBAAmB,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAA,GAAI,CAAC,GAAG,EAAA,CAAG,CAAA,GAAI,CAAC,CAAC,CAAA,IAAKD,iBAAe,OAAO,IAAA;AAAA,IAC9F;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAU,OAAO,IAAA;AAC3B,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAClE,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,eAAAA,GAAgB,CAAA,EAAG,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,QAAQ,MAAA,EAAO;AAAA,IAChG;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACtGA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEA,IAAMQ,UAAS,CAAC,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,EAAK,KAAK,KAAK,CAAA;AAEvC,IAAM,kBAAN,MAA0C;AAAA,EAQ7C,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,iBAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,MAAM,IAAI,EAAA,CAAG,MAAA;AAEb,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,iBAAA,EAAmB,IAAA,CAAK,OAAO,KAAK,CAAA;AAE3D,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAGrE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK,GAAA,CAAI,MAAA,CAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACnD,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,IAAI,KAAK,CAAA,EAAG;AACR,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,WAAA,GAAc,YAAA,CAAa,CAAA,CAAE,WAAA,EAAa,IAAI,CAAA;AAClD,MAAA,GAAA,CAAI,YAAY,CAAA,CAAE,SAAA;AAClB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,IAAI,CAAA,GAAI,GAAG,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAClC,MAAA,IAAI,CAAA,GAAI,GAAG,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAClC,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,IAChB;AAGA,IAAA,IAAI,KAAK,CAAA,EAAG;AACR,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,WAAA,GAAc,YAAA,CAAa,CAAA,CAAE,WAAA,EAAa,IAAI,CAAA;AAClD,MAAA,GAAA,CAAI,YAAY,CAAA,CAAE,SAAA;AAClB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,IAChB;AAGA,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,UAAA,GAAa,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACxD,MAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,MAAA,GAAA,CAAI,QAAA,CAASA,OAAAA,CAAO,CAAC,CAAA,IAAK,OAAO,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,GAAI,CAAA,EAAG,EAAA,CAAG,CAAC,IAAI,CAAC,CAAA;AAAA,IAC7D;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACpC,MAAA,IAAIR,qBAAmB,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAA,GAAI,CAAC,GAAG,EAAA,CAAG,CAAA,GAAI,CAAC,CAAC,CAAA,IAAKD,iBAAe,OAAO,IAAA;AAAA,IAC9F;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAU,OAAO,IAAA;AAC3B,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAClE,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,eAAAA,GAAgB,CAAA,EAAG,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,QAAQ,MAAA,EAAO;AAAA,IAChG;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACrIA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEA,IAAMQ,OAAAA,GAAS,CAAC,GAAA,EAAK,GAAA,EAAK,KAAK,IAAA,EAAM,GAAA,EAAK,MAAM,KAAK,CAAA;AAE9C,IAAM,qBAAN,MAA6C;AAAA,EAQhD,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,oBAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAE3E,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,oBAAA,EAAsB,IAAA,CAAK,OAAO,KAAK,CAAA;AAE9D,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AACrE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,MAAA,EAAQ,CAAA,EAAA,EAAK,GAAA,CAAI,MAAA,CAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAC3D,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAElB,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,QAAQ,CAAA,EAAA,EAAK;AAChC,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,UAAA,GAAa,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACxD,MAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,MAAA,GAAA,CAAI,QAAA,CAASA,OAAAA,CAAO,CAAC,CAAA,IAAK,OAAO,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,GAAI,CAAA,EAAG,EAAA,CAAG,CAAC,IAAI,CAAC,CAAA;AAAA,IAC7D;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACpC,MAAA,IAAIR,qBAAmB,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAA,GAAI,CAAC,GAAG,EAAA,CAAG,CAAA,GAAI,CAAC,CAAC,CAAA,IAAKD,iBAAe,OAAO,IAAA;AAAA,IAC9F;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAU,OAAO,IAAA;AAC3B,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAClE,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,eAAAA,GAAgB,CAAA,EAAG,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,QAAQ,MAAA,EAAO;AAAA,IAChG;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACtGA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEA,IAAMQ,OAAAA,GAAS,CAAC,GAAA,EAAK,GAAA,EAAK,KAAK,KAAK,CAAA;AAE7B,IAAM,aAAN,MAAqC;AAAA,EAQxC,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,YAAA;AAChB,IAAA,IAAA,CAAS,cAAA,GAAiB,CAAA;AAMtB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAE3E,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,YAAA,EAAc,IAAA,CAAK,OAAO,KAAK,CAAA;AAEtD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AACrE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,MAAA,EAAQ,CAAA,EAAA,EAAK,GAAA,CAAI,MAAA,CAAO,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAC3D,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAElB,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,QAAQ,CAAA,EAAA,EAAK;AAChC,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,EAAG,UAAA,GAAa,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACxD,MAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,MAAA,GAAA,CAAI,QAAA,CAASA,OAAAA,CAAO,CAAC,CAAA,IAAK,OAAO,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA,GAAI,CAAA,EAAG,EAAA,CAAG,CAAC,IAAI,CAAC,CAAA;AAAA,IAC7D;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAC5E,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAC3E,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACpC,MAAA,IAAIR,qBAAmB,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,GAAG,CAAA,GAAI,CAAC,GAAG,EAAA,CAAG,CAAA,GAAI,CAAC,CAAC,CAAA,IAAKD,iBAAe,OAAO,IAAA;AAAA,IAC9F;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,EAAU,OAAO,IAAA;AAC3B,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAClE,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,eAAAA,GAAgB,CAAA,EAAG,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,QAAQ,MAAA,EAAO;AAAA,IAChG;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACvGA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEO,IAAM,QAAN,MAAgC;AAAA,EAQnC,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,OAAA;AAChB,IAAA,IAAA,CAAS,SAAA,GAAY,IAAA;AAMjB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACpE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,MACnC,GAAG,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,UAAU,MAAM,CAAA;AAAA,MAC9C,GAAG,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,MAAM;AAAA,KACjD,CAAE,CAAA;AAEF,IAAA,MAAM,aAAa,IAAA,CAAK,QAAA,GAAW,QAAA,CAAS,MAAA,GAAS,SAAS,MAAA,GAAS,CAAA;AAEvE,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,OAAA,EAAS,IAAA,CAAK,OAAO,KAAK,CAAA;AAEjD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,GAAA,CAAI,OAAA,GAAU,OAAA;AACd,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AAGf,IAAA,IAAI,cAAc,CAAA,EAAG;AACjB,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,SAAS,CAAC,CAAA,CAAE,GAAG,QAAA,CAAS,CAAC,EAAE,CAAC,CAAA;AACvC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACjC,QAAA,GAAA,CAAI,MAAA,CAAO,SAAS,CAAC,CAAA,CAAE,GAAG,QAAA,CAAS,CAAC,EAAE,CAAC,CAAA;AAAA,MAC3C;AACA,MAAA,GAAA,CAAI,MAAA,EAAO;AAAA,IACf;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,QAAA,CAAS,UAAU,CAAA,EAAG;AACxC,MAAA,MAAM,IAAA,GAAO,SAAS,MAAA,GAAS,CAAA;AAC/B,MAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,QAAA,CAAS,IAAA,GAAO,CAAC,CAAA,CAAE,GAAG,QAAA,CAAS,IAAA,GAAO,CAAC,CAAA,CAAE,CAAC,CAAA;AACrD,MAAA,GAAA,CAAI,MAAA,CAAO,SAAS,IAAI,CAAA,CAAE,GAAG,QAAA,CAAS,IAAI,EAAE,CAAC,CAAA;AAC7C,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAAA,IACtB;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AAEnC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,MACnC,GAAG,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,UAAU,MAAM,CAAA;AAAA,MAC9C,GAAG,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,MAAM;AAAA,KACjD,CAAE,CAAA;AAEF,IAAA,MAAM,WAAW,IAAA,CAAK,QAAA,GAAW,SAAS,MAAA,GAAS,CAAA,GAAI,SAAS,MAAA,GAAS,CAAA;AACzE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AAC/B,MAAA,IAAIA,oBAAAA,CAAmB,GAAG,CAAA,EAAG,QAAA,CAAS,CAAC,CAAA,CAAE,CAAA,EAAG,QAAA,CAAS,CAAC,CAAA,CAAE,CAAA,EAAG,SAAS,CAAA,GAAI,CAAC,EAAE,CAAA,EAAG,QAAA,CAAS,IAAI,CAAC,CAAA,CAAE,CAAC,CAAA,IAAKD,eAAAA,EAAe;AAC/G,QAAA,OAAO,IAAA;AAAA,MACX;AAAA,IACJ;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAGrC,IAAA,MAAM,UAAU,CAAC,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,SAAS,CAAC,CAAA;AAC1C,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAClE,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC5HA,IAAMA,eAAAA,GAAgB,EAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEO,IAAM,cAAN,MAAsC;AAAA,EAQzC,YAAY,KAAA,EAAqB;AANjC,IAAA,IAAA,CAAS,IAAA,GAAO,aAAA;AAChB,IAAA,IAAA,CAAS,SAAA,GAAY,IAAA;AAMjB,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAClE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,MACnC,GAAG,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,UAAU,MAAM,CAAA;AAAA,MAC9C,GAAG,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,MAAM;AAAA,KACjD,CAAE,CAAA;AAEF,IAAA,MAAM,aAAa,IAAA,CAAK,QAAA,GAAW,QAAA,CAAS,MAAA,GAAS,SAAS,MAAA,GAAS,CAAA;AAEvE,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,aAAA,EAAe,IAAA,CAAK,OAAO,KAAK,CAAA;AAEvD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,WAAA,GAAc,YAAA,CAAa,CAAA,CAAE,WAAA,EAAa,EAAE,WAAW,CAAA;AAC3D,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,GAAA,CAAI,OAAA,GAAU,OAAA;AACd,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AAGf,IAAA,IAAI,cAAc,CAAA,EAAG;AACjB,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,SAAS,CAAC,CAAA,CAAE,GAAG,QAAA,CAAS,CAAC,EAAE,CAAC,CAAA;AACvC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACjC,QAAA,GAAA,CAAI,MAAA,CAAO,SAAS,CAAC,CAAA,CAAE,GAAG,QAAA,CAAS,CAAC,EAAE,CAAC,CAAA;AAAA,MAC3C;AACA,MAAA,GAAA,CAAI,MAAA,EAAO;AAAA,IACf;AAGA,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,QAAA,CAAS,UAAU,CAAA,EAAG;AACxC,MAAA,MAAM,IAAA,GAAO,SAAS,MAAA,GAAS,CAAA;AAC/B,MAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,QAAA,CAAS,IAAA,GAAO,CAAC,CAAA,CAAE,GAAG,QAAA,CAAS,IAAA,GAAO,CAAC,CAAA,CAAE,CAAC,CAAA;AACrD,MAAA,GAAA,CAAI,MAAA,CAAO,SAAS,IAAI,CAAA,CAAE,GAAG,QAAA,CAAS,IAAI,EAAE,CAAC,CAAA;AAC7C,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAAA,IACtB;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AAEnC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,MACnC,GAAG,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,QAAA,EAAU,UAAU,MAAM,CAAA;AAAA,MAC9C,GAAG,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,MAAM;AAAA,KACjD,CAAE,CAAA;AAEF,IAAA,MAAM,WAAW,IAAA,CAAK,QAAA,GAAW,SAAS,MAAA,GAAS,CAAA,GAAI,SAAS,MAAA,GAAS,CAAA;AACzE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AAC/B,MAAA,IAAIA,oBAAAA,CAAmB,GAAG,CAAA,EAAG,QAAA,CAAS,CAAC,CAAA,CAAE,CAAA,EAAG,QAAA,CAAS,CAAC,CAAA,CAAE,CAAA,EAAG,SAAS,CAAA,GAAI,CAAC,EAAE,CAAA,EAAG,QAAA,CAAS,IAAI,CAAC,CAAA,CAAE,CAAC,CAAA,IAAKD,eAAAA,EAAe;AAC/G,QAAA,OAAO,IAAA;AAAA,MACX;AAAA,IACJ;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAGrC,IAAA,MAAM,UAAU,CAAC,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,SAAS,CAAC,CAAA;AAC1C,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA;AACnE,MAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAClE,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC5HA,IAAMA,eAAAA,GAAgB,CAAA;AAEf,IAAM,WAAN,MAAmC;AAAA,EAOtC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,UAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,SAAS,EAAA,GAAK,EAAA;AACpB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA,GAAI,CAAA;AACtC,IAAA,MAAM,IAAA,GAAA,CAAQ,KAAK,EAAA,IAAM,CAAA;AAEzB,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,UAAA,EAAY,IAAA,CAAK,OAAO,KAAK,CAAA;AAEpD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAErE,IAAA,GAAA,CAAI,SAAA,EAAU;AAEd,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,GAAI,CAAA,EAAG;AAEtB,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AAAA,IACrB,CAAA,MAAO;AACH,MAAA,GAAA,CAAI,OAAO,EAAA,EAAI,IAAA,GAAO,YAAY,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,CAAA;AAC7C,MAAA,MAAM,IAAA,GAAO,MAAA,GAAS,CAAA,GAAI,CAAA,GAAI,EAAA;AAC9B,MAAA,MAAM,IAAA,GAAO,EAAA;AACb,MAAA,KAAA,IAAS,CAAA,GAAI,EAAA,GAAK,IAAA,EAAO,MAAA,GAAS,CAAA,GAAI,KAAK,IAAA,GAAO,CAAA,IAAK,IAAA,EAAO,CAAA,IAAK,IAAA,EAAM;AACrE,QAAA,MAAM,CAAA,GAAA,CAAK,IAAI,EAAA,IAAM,MAAA;AACrB,QAAA,MAAM,CAAA,GAAI,OAAO,SAAA,GAAY,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,KAAK,CAAC,CAAA;AACrD,QAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,MACnB;AAEA,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,IAAA,GAAO,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,GAAI,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,IAC3D;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA,EAAyB;AAC7D,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,EAAG,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAChD,MAAA,GAAA,CAAI,IAAA,EAAK;AAAA,IACb;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AAEnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,SAAS,EAAA,GAAK,EAAA;AACpB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA,GAAI,CAAA;AACtC,IAAA,MAAM,IAAA,GAAA,CAAQ,KAAK,EAAA,IAAM,CAAA;AAEzB,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,GAAI,CAAA,EAAG;AACtB,MAAA,OAAO,KAAK,KAAA,CAAM,CAAA,GAAI,EAAA,EAAI,CAAA,GAAI,IAAI,CAAA,IAAKA,eAAAA;AAAA,IAC3C;AAGA,IAAA,MAAM,IAAA,GAAO,MAAA,GAAS,CAAA,GAAI,CAAA,GAAI,EAAA;AAC9B,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,MAAA,GAAS,IAAA,GAAO,SAAA,GAAY,IAAA,CAAK,IAAI,CAAC,CAAA;AAE1C,IAAA,KAAA,IAAS,KAAK,EAAA,GAAK,IAAA,EAAO,SAAS,CAAA,GAAI,EAAA,IAAM,KAAK,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,GAAI,MAAM,EAAA,GAAK,IAAA,CAAK,IAAI,IAAI,CAAA,EAAI,MAAM,IAAA,EAAM;AACvG,MAAA,MAAM,SAAA,GAAY,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AACjE,MAAA,MAAM,CAAA,GAAA,CAAK,YAAY,EAAA,IAAM,MAAA;AAC7B,MAAA,MAAM,EAAA,GAAK,OAAO,SAAA,GAAY,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,KAAK,CAAC,CAAA;AACtD,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,SAAA,EAAW,IAAI,EAAE,CAAA,IAAKA,iBAAe,OAAO,IAAA;AAE/D,MAAA,MAAM,EAAA,GAAK,SAAA,GAAY,MAAA,EAAQ,EAAA,GAAK,EAAA,GAAK,MAAA;AACzC,MAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,MAAA,IAAI,QAAQ,CAAA,EAAG;AACX,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,CAAA,GAAI,MAAA,IAAU,EAAA,GAAA,CAAM,CAAA,GAAI,MAAA,IAAU,EAAA,IAAM,KAAK,CAAC,CAAA;AACnF,QAAA,MAAM,KAAA,GAAQ,SAAS,EAAA,GAAK,EAAA;AAC5B,QAAA,MAAM,KAAA,GAAQ,SAAS,EAAA,GAAK,EAAA;AAC5B,QAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,KAAA,EAAO,IAAI,KAAK,CAAA,IAAKA,iBAAe,OAAO,IAAA;AAAA,MAClE;AACA,MAAA,MAAA,GAAS,SAAA;AACT,MAAA,MAAA,GAAS,EAAA;AACT,MAAA,IAAI,cAAc,EAAA,EAAI;AAAA,IAC1B;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,MAAM,GAAA,GAAM;AAAA,MACR,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA,EAAE;AAAA,MAC9H,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAAE,KAClI;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AAC/D,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACpJA,IAAMA,eAAAA,GAAgB,CAAA;AAEf,IAAM,cAAN,MAAsC;AAAA,EAOzC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,aAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAClE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,QAAA,GAAW,GAAG,QAAQ,CAAA;AACnD,IAAA,IAAI,aAAa,CAAA,EAAG;AAEpB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AAEvD,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,aAAA,EAAe,IAAA,CAAK,OAAO,KAAK,CAAA;AAEvD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAc,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACrD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAErE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AACzB,MAAA,MAAM,MAAA,GAAS,EAAA,CAAG,QAAA,GAAW,QAAA,GAAW,CAAA;AACxC,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,MAAA,EAAQ,UAAU,MAAM,CAAA;AACjD,MAAA,IAAI,IAAI,MAAA,EAAQ;AAEhB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AACf,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,MAAM,CAAA;AACpB,MAAA,GAAA,CAAI,MAAA,EAAO;AAAA,IACf;AAEA,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,MAAA,GAAS,CAAA,EAAG,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAC1D,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,MAAA,GAAS,CAAA,EAAG,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAC1D,IAAA,GAAA,CAAI,IAAA,EAAK;AAET,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,EAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,QAAA,GAAW,GAAG,QAAQ,CAAA;AACnD,IAAA,IAAI,QAAA,KAAa,GAAG,OAAO,KAAA;AAE3B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AACzB,MAAA,MAAM,MAAA,GAAS,EAAA,CAAG,QAAA,GAAW,QAAA,GAAW,CAAA;AACxC,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,QAAA,CAAS,MAAA,EAAQ,UAAU,MAAM,CAAA;AAClD,MAAA,IAAI,KAAK,MAAA,EAAQ;AACjB,MAAA,IAAI,KAAK,GAAA,CAAI,CAAA,GAAI,EAAE,CAAA,IAAKA,iBAAe,OAAO,IAAA;AAAA,IAClD;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,GAAA,GAAM;AAAA,MACR,EAAE,EAAA,EAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA,EAAG,EAAA,EAAI,SAAS,CAAA,EAAE;AAAA,MAChF,EAAE,EAAA,EAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA,EAAG,EAAA,EAAI,SAAS,CAAA;AAAE,KACpF;AACA,IAAA,MAAM,OAAA,GAAU,CAAC,MAAA,EAAQ,WAAW,CAAA;AACpC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AAC/D,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,OAAA,CAAQ,CAAC,CAAA,EAAE;AAAA,MAC/C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AChHA,IAAMA,eAAAA,GAAgB,CAAA;AAEf,IAAM,aAAN,MAAqC;AAAA,EAOxC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,YAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAClE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,QAAA,GAAW,GAAG,QAAQ,CAAA;AACnD,IAAA,IAAI,aAAa,CAAA,EAAG;AAEpB,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,YAAA,EAAc,IAAA,CAAK,OAAO,KAAK,CAAA;AACtD,IAAA,MAAM,QAAA,GAAW,CAAA;AACjB,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,CAAA,CAAE,SAAA,EAAW,EAAE,WAAW,CAAA;AAExD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AAGnD,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,QAAA,EAAU,CAAA,EAAA,EAAK;AAChC,MAAA,MAAM,MAAA,GAAS,EAAA,CAAG,QAAA,GAAW,QAAA,GAAW,CAAA;AACxC,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,MAAA,EAAQ,UAAU,MAAM,CAAA;AACjD,MAAA,IAAI,IAAI,MAAA,EAAQ;AAChB,MAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IACjB;AAGA,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,IAAI,CAAA,GAAI,MAAM,CAAA,EAAG;AACb,QAAA,GAAA,CAAI,SAAA,GAAY,QAAA;AAChB,QAAA,GAAA,CAAI,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA;AAAA,MAChE;AAAA,IACJ;AAGA,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AACrE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,CAAC,CAAA;AACvB,MAAA,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA;AAC5B,MAAA,GAAA,CAAI,MAAA,EAAO;AAGX,MAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,MAAA,GAAA,CAAI,QAAA,CAAS,OAAO,CAAA,GAAI,CAAC,GAAG,MAAA,CAAO,CAAC,CAAA,GAAI,CAAA,EAAG,EAAE,CAAA;AAAA,IACjD;AACA,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,MAAA,GAAS,CAAA,EAAG,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAC1D,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,MAAA,GAAS,CAAA,EAAG,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAC1D,IAAA,GAAA,CAAI,IAAA,EAAK;AAET,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,EAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,QAAA,GAAW,GAAG,QAAQ,CAAA;AACnD,IAAA,IAAI,QAAA,KAAa,GAAG,OAAO,KAAA;AAE3B,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AACzB,MAAA,MAAM,MAAA,GAAS,EAAA,CAAG,QAAA,GAAW,QAAA,GAAW,CAAA;AACxC,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,QAAA,CAAS,MAAA,EAAQ,UAAU,MAAM,CAAA;AAClD,MAAA,IAAI,KAAK,MAAA,EAAQ;AAEjB,MAAA,IAAI,KAAK,GAAA,CAAI,CAAA,GAAI,EAAE,CAAA,IAAKA,iBAAe,OAAO,IAAA;AAE9C,MAAA,IAAI,IAAI,CAAA,EAAG;AACP,QAAA,MAAM,UAAA,GAAa,EAAA,CAAG,QAAA,GAAW,QAAA,IAAY,CAAA,GAAI,CAAA,CAAA;AACjD,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,QAAA,CAAS,UAAA,EAAY,UAAU,MAAM,CAAA;AACzD,QAAA,IAAI,CAAA,IAAK,EAAA,IAAM,CAAA,IAAK,KAAA,EAAO,OAAO,IAAA;AAAA,MACtC;AAAA,IACJ;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,GAAA,GAAM;AAAA,MACR,EAAE,EAAA,EAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA,EAAG,EAAA,EAAI,SAAS,CAAA,EAAE;AAAA,MAChF,EAAE,EAAA,EAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA,EAAG,EAAA,EAAI,SAAS,CAAA;AAAE,KACpF;AACA,IAAA,MAAM,OAAA,GAAU,CAAC,MAAA,EAAQ,WAAW,CAAA;AACpC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AAC/D,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,OAAA,CAAQ,CAAC,CAAA,EAAE;AAAA,MAC/C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC1IA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASC,qBAAmB,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,EAAoB;AACxG,EAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAA,GAAK,EAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC7B,EAAA,IAAI,KAAA,KAAU,GAAG,OAAO,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAA,CAAA,CAAK,EAAA,GAAK,EAAA,IAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,EAAA,IAAM,KAAK,CAAC,CAAA;AAC5E,EAAA,OAAO,IAAA,CAAK,MAAM,EAAA,IAAM,EAAA,GAAK,IAAI,EAAA,CAAA,EAAK,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AAC5D;AAEO,IAAM,aAAN,MAAqC;AAAA,EAOxC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,YAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACnE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,YAAA,EAAc,IAAA,CAAK,OAAO,KAAK,CAAA;AACtD,IAAA,MAAM,SAAS,EAAA,GAAK,EAAA;AAGpB,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,GAAI,IAAA,EAAO;AAE1B,MAAA,IAAA,GAAO,EAAA;AACP,MAAA,IAAA,GAAO,MAAM,EAAA,GAAK,EAAA,CAAA;AAAA,IACtB,CAAA,MAAO;AACH,MAAA,MAAM,KAAA,GAAA,CAAS,KAAK,EAAA,IAAM,MAAA;AAC1B,MAAA,IAAA,GAAO,MAAA;AACP,MAAA,IAAA,GAAO,EAAA,GAAK,SAAS,MAAA,GAAS,EAAA,CAAA;AAAA,IAClC;AAEA,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,YAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAc,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AAGrD,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,cAAA,CAAe,GAAA,EAAK,EAAE,SAAA,KAAc,OAAA,GAAU,WAAW,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AACnF,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,CAAO,MAAM,IAAI,CAAA;AACrB,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,GAAA,CAAI,IAAI,EAAA,EAAI,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAClD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,GAAA,CAAI,IAAI,EAAA,EAAI,UAAA,GAAa,IAAI,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AAClD,IAAA,GAAA,CAAI,IAAA,EAAK;AAET,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,SAAS,EAAA,GAAK,EAAA;AACpB,IAAA,IAAI,IAAA,EAAc,IAAA;AAClB,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,GAAI,IAAA,EAAO;AAC1B,MAAA,IAAA,GAAO,EAAA;AACP,MAAA,IAAA,GAAO,MAAM,EAAA,GAAK,EAAA,CAAA;AAAA,IACtB,CAAA,MAAO;AACH,MAAA,MAAM,KAAA,GAAA,CAAS,KAAK,EAAA,IAAM,MAAA;AAC1B,MAAA,IAAA,GAAO,MAAA;AACP,MAAA,IAAA,GAAO,EAAA,GAAK,SAAS,MAAA,GAAS,EAAA,CAAA;AAAA,IAClC;AAEA,IAAA,OACIA,qBAAmB,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKD,eAAAA,IAC5CC,oBAAAA,CAAmB,GAAG,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,IAAA,EAAM,IAAI,CAAA,IAAKD,eAAAA;AAAA,EAExD;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,GAAA,GAAM;AAAA,MACR,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA,EAAE;AAAA,MAC9H,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAAE,KAClI;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AAC/D,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,MAAA,EAAO;AAAA,MAC3C;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC/IA,IAAMA,eAAAA,GAAgB,CAAA;AAEtB,SAASG,eAAc,GAAA,EAA+B,KAAA,EAAe,OAAe,GAAA,EAAa,GAAA,EAAa,OAAO,CAAA,EAAS;AAC1H,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,KAAA,EAAO,MAAM,KAAK,CAAA;AACjD,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,MAAA,CAAO,KAAK,GAAG,CAAA;AACnB,EAAA,GAAA,CAAI,OAAO,GAAA,GAAM,IAAA,GAAO,KAAK,GAAA,CAAI,KAAA,GAAQ,KAAK,EAAA,GAAK,CAAC,CAAA,EAAG,GAAA,GAAM,OAAO,IAAA,CAAK,GAAA,CAAI,QAAQ,IAAA,CAAK,EAAA,GAAK,CAAC,CAAC,CAAA;AACjG,EAAA,GAAA,CAAI,OAAO,GAAA,GAAM,IAAA,GAAO,KAAK,GAAA,CAAI,KAAA,GAAQ,KAAK,EAAA,GAAK,CAAC,CAAA,EAAG,GAAA,GAAM,OAAO,IAAA,CAAK,GAAA,CAAI,QAAQ,IAAA,CAAK,EAAA,GAAK,CAAC,CAAC,CAAA;AACjG,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,IAAA,EAAK;AACb;AAEO,IAAM,kBAAN,MAA0C;AAAA,EAO7C,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,iBAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,GAAA,EAAM,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACjE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,GAAA,EACA,KAAA,EACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACA,UAAA,EACA,cAAA,GAAiB,CAAA,EACjB,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,IAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,KAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,IAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,IAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,IAAS,KAAA,GAAQ,IAAA;AACvB,IAAA,MAAM,IAAS,IAAA,GAAO,IAAA;AACtB,IAAA,MAAM,IAAA,GAAS,OAAO,CAAA,GAAI,CAAA;AAC1B,IAAA,MAAM,QAAA,GAAA,CAAY,EAAA,CAAG,KAAA,GAAQ,EAAA,CAAG,KAAA,IAAS,CAAA;AAEzC,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,iBAAA,EAAmB,IAAA,CAAK,OAAO,KAAK,CAAA;AAE3D,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AAGnD,IAAA,GAAA,CAAI,SAAA,GAAY,YAAA,CAAa,CAAA,CAAE,SAAA,EAAW,EAAE,WAAW,CAAA;AACvD,IAAA,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,IAAA,EAAM,CAAA,EAAG,CAAC,CAAA;AAE7B,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AAGrE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,MAAM,EAAE,CAAA;AACnB,IAAA,GAAA,CAAI,MAAA,CAAO,OAAO,EAAE,CAAA;AACpB,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,CAAS,QAAA,EAAU,YAAY,MAAM,CAAA;AACxD,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,MAAM,IAAI,CAAA;AACrB,IAAA,GAAA,CAAI,MAAA,CAAO,OAAO,IAAI,CAAA;AACtB,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,MAAM,EAAE,CAAA;AACnB,IAAA,GAAA,CAAI,MAAA,CAAO,OAAO,EAAE,CAAA;AACpB,IAAA,GAAA,CAAI,MAAA,EAAO;AAEX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,GAAA,CAAI,QAAA,CAAS,GAAG,KAAA,CAAM,OAAA,CAAQ,cAAc,CAAA,EAAG,KAAA,GAAQ,CAAA,EAAG,EAAA,GAAK,CAAC,CAAA;AAChE,IAAA,GAAA,CAAI,QAAA,CAAS,SAAS,OAAA,CAAQ,cAAc,GAAI,KAAA,GAAQ,CAAA,EAAG,OAAO,CAAC,CAAA;AACnE,IAAA,GAAA,CAAI,QAAA,CAAS,GAAG,KAAA,CAAM,OAAA,CAAQ,cAAc,CAAA,EAAI,KAAA,GAAQ,CAAA,EAAG,EAAA,GAAK,CAAC,CAAA;AAGjE,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,MAAM,IAAI,CAAA;AACrB,IAAA,GAAA,CAAI,MAAA,CAAO,MAAM,IAAI,CAAA;AACrB,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAAA,cAAAA,CAAc,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AACzC,IAAAA,cAAAA,CAAc,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAEzC,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC7B,IAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC7B,IAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAE7B,IAAA,OAAO,KAAK,IAAA,IAAQ,CAAA,IAAK,KAAA,IAAS,CAAA,IAAK,QAAQ,CAAA,IAAK,IAAA;AAAA,EACxD;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,GAAA,GAAM;AAAA,MACR,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA,EAAE;AAAA,MAC9H,EAAE,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,QAAA,EAAU,MAAM,GAAG,EAAA,EAAI,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAAE,KAClI;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACjC,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,CAAE,EAAE,CAAA,IAAKH,kBAAgB,CAAA,EAAG;AAC/D,QAAA,OAAO,EAAE,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,WAAA,EAAY;AAAA,MAChD;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;ACrJA,IAAMA,eAAAA,GAAgB,CAAA;AAEf,IAAM,YAAN,MAAoC;AAAA,EAOvC,YAAY,KAAA,EAAqB;AALjC,IAAA,IAAA,CAAS,IAAA,GAAO,WAAA;AAMZ,IAAA,IAAA,CAAK,EAAA,GAAK,CAAA,MAAA,EAAS,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AACpE,IAAA,IAAA,CAAK,SAAS,CAAC,KAAA,EAAO,EAAE,GAAG,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,UAAA,EACA,eAAA,EACA,KAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC1B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC1B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA;AAC3B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,CAAA;AAE3B,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,WAAA,EAAa,IAAA,CAAK,OAAO,KAAK,CAAA;AAErD,IAAA,GAAA,CAAI,IAAA,EAAK;AAGT,IAAA,GAAA,CAAI,SAAA,GAAY,YAAA,CAAa,CAAA,CAAE,SAAA,EAAW,EAAE,WAAW,CAAA;AACvD,IAAA,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AAG3B,IAAA,GAAA,CAAI,cAAc,CAAA,CAAE,WAAA;AACpB,IAAA,GAAA,CAAI,SAAA,GAAY,UAAA,GAAa,CAAA,CAAE,SAAA,GAAY,MAAM,CAAA,CAAE,SAAA;AACnD,IAAA,cAAA,CAAe,KAAK,UAAA,GAAa,OAAA,GAAU,CAAA,CAAE,SAAA,EAAW,IAAI,SAAS,CAAA;AACrE,IAAA,GAAA,CAAI,UAAA,CAAW,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AAC7B,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AACvB,IAAA,GAAA,CAAI,IAAA,EAAK;AAET,IAAA,GAAA,CAAI,WAAA,GAAc,YAAA,CAAa,CAAA,CAAE,WAAA,EAAa,IAAI,CAAA;AAClD,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AAEtB,IAAA,MAAM,IAAA,GAAO,EAAA;AACb,IAAA,MAAM,aAAa,EAAA,GAAK,EAAA;AACxB,IAAA,KAAA,IAAS,SAAS,CAAC,EAAA,EAAI,MAAA,IAAU,UAAA,EAAY,UAAU,IAAA,EAAM;AACzD,MAAA,MAAM,MAAM,EAAA,GAAK,MAAA;AACjB,MAAA,MAAM,GAAA,GAAM,EAAA;AACZ,MAAA,MAAM,GAAA,GAAM,KAAK,MAAA,GAAS,EAAA;AAC1B,MAAA,MAAM,MAAM,EAAA,GAAK,EAAA;AACjB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,KAAK,GAAG,CAAA;AACnB,MAAA,GAAA,CAAI,MAAA,CAAO,KAAK,GAAG,CAAA;AACnB,MAAA,GAAA,CAAI,MAAA,EAAO;AAAA,IACf;AAEA,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,IAAA,GAAA,CAAI,OAAA,EAAQ;AAGZ,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAY,QAAA;AAChB,IAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AACnB,IAAA,GAAA,CAAI,SAAS,YAAA,EAAc,EAAA,GAAK,KAAK,CAAA,EAAG,EAAA,GAAK,KAAK,CAAC,CAAA;AAGnD,IAAA,IAAI,UAAA,EAAY;AACZ,MAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAChB,MAAA,GAAA,CAAI,YAAA,GAAe,YAAA;AACnB,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,CAAA,IAAK,CAAC,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA,EAAyB;AAC/D,QAAA,GAAA,CAAI,SAAA,EAAU;AACd,QAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,KAAK,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACnC,QAAA,GAAA,CAAI,YAAY,CAAA,CAAE,WAAA;AAClB,QAAA,GAAA,CAAI,IAAA,EAAK;AAAA,MACb;AAAA,IACJ;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACO;AACP,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,KAAA;AACnC,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,IAAA,CAAK,MAAA;AACtB,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AACtD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,QAAA,EAAU,UAAU,MAAM,CAAA;AACvD,IAAA,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,EAAA,CAAG,KAAA,EAAO,YAAY,MAAM,CAAA;AAEtD,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,GAAIA,eAAAA;AAC9B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,GAAIA,eAAAA;AAC9B,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,IAAIA,eAAAA,GAAgB,CAAA;AAC/C,IAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAE,IAAIA,eAAAA,GAAgB,CAAA;AAE/C,IAAA,OAAO,CAAA,IAAK,MAAM,CAAA,IAAK,EAAA,GAAK,MAAM,CAAA,IAAK,EAAA,IAAM,KAAK,EAAA,GAAK,EAAA;AAAA,EAC3D;AAAA,EAEA,UACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACoB;AACpB,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AACnC,IAAA,MAAM,OAAA,GAAsC;AAAA,MACxC,CAAC,GAAG,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,EAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA,EAAG,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC,CAAA;AAAA,MACvH,CAAC,GAAG,KAAA,CAAM,QAAA,CAAS,KAAK,MAAA,CAAO,CAAC,EAAE,QAAA,EAAU,QAAA,EAAU,MAAM,CAAA,EAAG,KAAA,CAAM,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAC;AAAA,KAC3H;AACA,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,KAAK,OAAA,EAAS;AAChC,MAAA,IAAI,IAAA,CAAK,MAAM,CAAA,GAAI,EAAA,EAAI,IAAI,EAAE,CAAA,IAAKA,kBAAgB,CAAA,EAAG;AACjD,QAAA,OAAO,EAAE,UAAA,EAAY,EAAA,EAAI,MAAA,EAAQ,aAAA,EAAc;AAAA,MACnD;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ;;;AC/DA,IAAM,kCAAkB,IAAI,GAAA,CAAqB,CAAC,MAAA,EAAQ,SAAA,EAAW,cAAc,CAAC,CAAA;AAE7E,IAAM,iBAAN,MAAqB;AAAA,EAArB,WAAA,GAAA;AACH,IAAA,IAAA,CAAQ,WAAuB,EAAC;AAChC,IAAA,IAAA,CAAQ,aAAA,GAAiC,IAAA;AACzC,IAAA,IAAA,CAAQ,eAAA,GAAmC,IAAA;AAC3C,IAAA,IAAA,CAAQ,UAAA,GAAqC,IAAA;AAC7C,IAAA,IAAA,CAAQ,KAAA,GAAsB,MAAA;AAC9B,IAAA,IAAA,CAAQ,UAAwB,EAAC;AACjC,IAAA,IAAA,CAAQ,YAA0B,EAAC;AACnC,IAAA,IAAA,CAAQ,kBAAA,GAA0C,IAAA;AAElD;AAAA,IAAA,IAAA,CAAA,gBAAA,GAAwC,IAAA;AAExC;AAAA,IAAA,IAAA,CAAA,eAAA,GAAwD,IAAA;AAQxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAA,eAAA,GAAwD,IAAA;AAExD;AAAA,IAAA,IAAA,CAAA,iBAAA,GAAiE,IAAA;AAEjE;AAAA,IAAA,IAAA,CAAQ,WAAA,GAAuB,KAAA;AAU/B;AAAA,IAAA,IAAA,CAAQ,WAAA,GAA+B,IAAA;AACvC,IAAA,IAAA,CAAQ,cAAA,GAAsC,IAAA;AAC9C,IAAA,IAAA,CAAQ,eAAA,GAAyC,IAAA;AAGjD;AAAA,IAAA,IAAA,CAAQ,aAAA,GAAiC,IAAA;AACzC,IAAA,IAAA,CAAQ,gBAAA,GAA2B,EAAA;AAAA,EAAA;AAAA;AAAA,EAb3B,YAAY,OAAA,EAAgC;AAChD,IAAA,IAAI,IAAA,CAAK,oBAAoB,OAAA,EAAS;AACtC,IAAA,IAAA,CAAK,eAAA,GAAkB,OAAA;AACvB,IAAA,IAAA,CAAK,oBAAoB,OAAO,CAAA;AAAA,EACpC;AAAA;AAAA,EAYA,cAAc,EAAA,EAAsB;AAChC,IAAA,IAAA,CAAK,kBAAA,GAAqB,EAAA;AAAA,EAC9B;AAAA;AAAA,EAGA,eAAe,OAAA,EAAwB;AACnC,IAAA,IAAA,CAAK,WAAA,GAAc,OAAA;AAAA,EACvB;AAAA;AAAA,EAIA,cAAc,IAAA,EAAoC;AAC9C,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,SAAA,IAAa,IAAA,CAAK,aAAA,EAAe;AAChD,MAAA,IAAA,CAAK,SAAS,GAAA,EAAI;AAAA,IACtB;AACA,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,IAAA,CAAK,KAAA,GAAQ,MAAA;AACb,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAA,EACzB;AAAA,EAEA,aAAA,GAAwC;AACpC,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EAChB;AAAA;AAAA;AAAA,EAKA,YAAY,KAAA,EAA8B;AACtC,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AAClB,MAAA,OAAO,KAAA;AAAA,IACX;AAEA,IAAA,IAAI,IAAA,CAAK,UAAU,MAAA,EAAQ;AACvB,MAAA,IAAA,CAAK,QAAA,EAAS;AACd,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,YAAY,KAAK,CAAA;AAC9D,MAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,aAAa,CAAA;AACrC,MAAA,IAAI,IAAA,CAAK,cAAc,QAAA,EAAU;AAE7B,QAAA,MAAM,YAAY,IAAA,CAAK,aAAA;AACvB,QAAA,IAAA,CAAK,YAAY,SAAS,CAAA;AAC1B,QAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,QAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,QAAA,IAAA,CAAK,kBAAA,IAAqB;AAC1B,QAAA,IAAA,CAAK,YAAA,EAAa;AAClB,QAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,SAAA,CAAU,IAAI,CAAA,EAAG;AACrC,UAAA,IAAA,CAAK,kBAAkB,SAAS,CAAA;AAAA,QACpC;AAAA,MACJ,CAAA,MAAO;AACH,QAAA,IAAA,CAAK,KAAA,GAAQ,SAAA;AAAA,MACjB;AACA,MAAA,OAAO,IAAA;AAAA,IACX;AAEA,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,SAAA,IAAa,IAAA,CAAK,aAAA,EAAe;AAChD,MAAA,MAAM,WAAA,GAAwB,IAAA,CAAK,aAAA,CAAsB,SAAA,IAAa,KAAA;AAEtE,MAAA,IAAI,WAAA,EAAa;AAGb,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,MAAA,GAAS,CAAA;AAChD,QAAA,IAAA,CAAK,cAAc,MAAA,CAAO,IAAI,CAAA,GAAI,EAAE,GAAG,KAAA,EAAM;AAC7C,QAAA,IAAA,CAAK,cAAc,MAAA,CAAO,IAAA,CAAK,EAAE,GAAG,OAAO,CAAA;AAC3C,QAAA,OAAO,IAAA;AAAA,MACX;AAEA,MAAA,MAAM,QAAA,GAAoB,IAAA,CAAK,aAAA,CAAsB,cAAA,IAAkB,CAAA;AACvE,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,MAAA;AAG1C,MAAA,IAAA,CAAK,cAAc,MAAA,CAAO,OAAA,GAAU,CAAC,CAAA,GAAI,EAAE,GAAG,KAAA,EAAM;AAEpD,MAAA,IAAI,UAAU,QAAA,EAAU;AAEpB,QAAA,IAAA,CAAK,cAAc,MAAA,CAAO,IAAA,CAAK,EAAE,GAAG,OAAO,CAAA;AAC3C,QAAA,OAAO,IAAA;AAAA,MACX;AAGA,MAAA,IAAA,CAAK,cAAc,QAAA,GAAW,IAAA;AAC9B,MAAA,MAAM,YAAY,IAAA,CAAK,aAAA;AACvB,MAAA,IAAA,CAAK,YAAY,SAAS,CAAA;AAC1B,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,MAAA,IAAA,CAAK,KAAA,GAAQ,MAAA;AACb,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA,IAAA,CAAK,kBAAA,IAAqB;AAC1B,MAAA,IAAA,CAAK,YAAA,EAAa;AAClB,MAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,SAAA,CAAU,IAAI,CAAA,EAAG;AACrC,QAAA,IAAA,CAAK,kBAAkB,SAAS,CAAA;AAAA,MACpC;AACA,MAAA,OAAO,IAAA;AAAA,IACX;AAEA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,YAAY,KAAA,EAA2B;AACnC,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,SAAA,IAAa,IAAA,CAAK,aAAA,EAAe;AAChD,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,MAAA,GAAS,CAAA;AAChD,MAAA,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,IAAI,CAAA,GAAI,KAAA;AAAA,IACtC;AACA,IAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,cAAA,IAAkB,KAAK,eAAA,EAAiB;AACjE,MAAA,MAAM,IAAA,GAAS,KAAA,CAAM,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,QAAA;AACpD,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,GAAW,IAAA,CAAK,cAAA,CAAe,KAAA;AACpD,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAK,WAAA,CAAY,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACrD,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,CAAC,CAAA;AACpC,QAAA,IAAI,CAAC,KAAA,EAAO;AACZ,QAAA,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,CAAC,CAAA,GAAI;AAAA,UACzB,QAAA,EAAU,MAAM,QAAA,GAAW,IAAA;AAAA,UAC3B,KAAA,EAAU,MAAM,KAAA,GAAW;AAAA,SAC/B;AAAA,MACJ;AAGA,MAAA,IAAA,CAAK,eAAA,GAAkB,KAAK,WAAW,CAAA;AAAA,IAC3C;AACA,IAAA,IAAI,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,gBAAA,IAAoB,CAAA,EAAG;AAClD,MAAA,IAAA,CAAK,cAAc,MAAA,CAAO,IAAA,CAAK,gBAAgB,CAAA,GAAI,EAAE,GAAG,KAAA,EAAM;AAI9D,MAAA,IAAA,CAAK,eAAA,GAAkB,KAAK,aAAa,CAAA;AAAA,IAC7C;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAA,GAAwB;AACpB,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,SAAA,IAAa,CAAC,KAAK,aAAA,EAAe;AACrD,IAAA,MAAM,WAAA,GAAwB,IAAA,CAAK,aAAA,CAAsB,SAAA,IAAa,KAAA;AACtE,IAAA,IAAI,CAAC,WAAA,EAAa;AAGlB,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AACtC,MAAA,IAAA,CAAK,aAAA,CAAc,OAAO,GAAA,EAAI;AAAA,IAClC;AACA,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AACtC,MAAA,IAAA,CAAK,SAAS,GAAA,EAAI;AAClB,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,MAAA,IAAA,CAAK,KAAA,GAAQ,MAAA;AACb,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA;AAAA,IACJ;AACA,IAAA,IAAA,CAAK,cAAc,QAAA,GAAW,IAAA;AAC9B,IAAA,IAAA,CAAK,WAAA,CAAY,KAAK,aAAa,CAAA;AACnC,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,IAAA,CAAK,KAAA,GAAQ,MAAA;AACb,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,IAAA,CAAK,kBAAA,IAAqB;AAC1B,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACtB;AAAA,EAEA,SAAA,CAAU,SAAmB,KAAA,EAA2B;AACpD,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,IAAA,CAAK,WAAA,GAAkB,OAAA;AACvB,IAAA,IAAA,CAAK,cAAA,GAAkB,EAAE,GAAG,KAAA,EAAM;AAClC,IAAA,IAAA,CAAK,eAAA,GAAkB,QAAQ,MAAA,CAAO,GAAA,CAAI,QAAM,EAAE,GAAG,GAAE,CAAE,CAAA;AAAA,EAC7D;AAAA,EAEA,OAAA,GAAgB;AACZ,IAAA,IAAA,CAAK,WAAA,GAAkB,IAAA;AACvB,IAAA,IAAA,CAAK,cAAA,GAAkB,IAAA;AACvB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACtB;AAAA,EAEA,iBAAA,GAA6B;AACzB,IAAA,OAAO,KAAK,WAAA,KAAgB,IAAA;AAAA,EAChC;AAAA;AAAA,EAGA,SAAA,GAAqB;AACjB,IAAA,OAAO,KAAK,KAAA,KAAU,SAAA;AAAA,EAC1B;AAAA,EAEA,WAAA,CAAY,SAAmB,UAAA,EAA0B;AACrD,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,IAAA,CAAK,aAAA,GAAmB,OAAA;AACxB,IAAA,IAAA,CAAK,gBAAA,GAAmB,UAAA;AAAA,EAC5B;AAAA,EAEA,SAAA,GAAkB;AACd,IAAA,IAAA,CAAK,aAAA,GAAmB,IAAA;AACxB,IAAA,IAAA,CAAK,gBAAA,GAAmB,EAAA;AACxB,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACtB;AAAA,EAEA,iBAAA,GAA6B;AACzB,IAAA,OAAO,KAAK,aAAA,KAAkB,IAAA;AAAA,EAClC;AAAA;AAAA,EAGA,gBAAgB,KAAA,EAAqB;AACjC,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,QAAA,EAAU;AACjC,MAAA,KAAA,MAAW,EAAA,IAAM,QAAQ,MAAA,EAAQ;AAC7B,QAAA,EAAA,CAAG,QAAA,IAAY,KAAA;AAAA,MACnB;AAAA,IACJ;AACA,IAAA,IAAI,KAAK,eAAA,EAAiB;AACtB,MAAA,KAAA,MAAW,EAAA,IAAM,KAAK,eAAA,EAAiB;AACnC,QAAA,EAAA,CAAG,QAAA,IAAY,KAAA;AAAA,MACnB;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA,EAGA,iBACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACmD;AACnD,IAAA,KAAA,IAAS,IAAI,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAChD,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AACzB,MAAA,IAAI,CAAC,CAAA,CAAE,QAAA,IAAY,EAAE,OAAA,KAAY,KAAA,IAAS,EAAE,MAAA,EAAQ;AACpD,MAAA,MAAM,CAAA,GAAI,EAAE,SAAA,CAAU,CAAA,EAAG,GAAG,KAAA,EAAO,QAAA,EAAU,UAAA,EAAY,MAAA,EAAQ,MAAM,CAAA;AACvE,MAAA,IAAI,GAAG,OAAO,EAAE,OAAA,EAAS,CAAA,EAAG,QAAQ,CAAA,EAAE;AAAA,IAC1C;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA,EAGA,QACI,CAAA,EACA,CAAA,EACA,OACA,QAAA,EACA,UAAA,EACA,QACA,MAAA,EACe;AACf,IAAA,KAAA,IAAS,IAAI,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAChD,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AACzB,MAAA,IAAI,CAAA,CAAE,OAAA,KAAY,KAAA,IAAS,CAAA,CAAE,MAAA,EAAQ;AACrC,MAAA,IAAI,CAAA,CAAE,QAAQ,CAAA,EAAG,CAAA,EAAG,OAAO,QAAA,EAAU,UAAA,EAAY,MAAA,EAAQ,MAAM,CAAA,EAAG;AAC9D,QAAA,OAAO,CAAA;AAAA,MACX;AAAA,IACJ;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,cAAc,OAAA,EAAgC;AAC1C,IAAA,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,EAC5B;AAAA,EAEA,kBAAA,GAAsC;AAClC,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EAChB;AAAA;AAAA,EAGA,eAAe,EAAA,EAA6B;AACxC,IAAA,OAAO,KAAK,QAAA,CAAS,IAAA,CAAK,OAAK,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA,IAAK,IAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAA,CAAmB,IAAY,KAAA,EAAkD;AAC7E,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,EAAE,CAAA;AACtC,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AACrB,IAAA,OAAA,CAAQ,KAAA,GAAQ,EAAE,GAAI,OAAA,CAAQ,SAAS,EAAC,EAAI,GAAG,KAAA,EAAM;AAErD,IAAA,MAAM,cAAe,KAAA,CAA2E,MAAA;AAChG,IAAA,MAAM,cAAA,GAAkB,QAAQ,KAAA,CAA2E,MAAA;AAC3G,IAAA,IAAI,eAAe,cAAA,EAAgB;AAC/B,MAAC,OAAA,CAAQ,MAA2E,MAAA,GAAS;AAAA,QACzF,GAAG,cAAA;AAAA,QACH,GAAG;AAAA,OACP;AAAA,IACJ;AACA,IAAA,IAAA,CAAK,YAAA,EAAa;AAClB,IAAA,OAAO,OAAA;AAAA,EACX;AAAA;AAAA,EAIA,UAAU,GAAA,EAAsB;AAC5B,IAAA,IAAI,QAAQ,QAAA,EAAU;AAClB,MAAA,IAAI,IAAA,CAAK,KAAA,KAAU,SAAA,IAAa,IAAA,CAAK,aAAA,EAAe;AAChD,QAAA,IAAA,CAAK,SAAS,GAAA,EAAI;AAClB,QAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,QAAA,IAAA,CAAK,KAAA,GAAQ,MAAA;AAAA,MACjB;AACA,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AACrB,MAAA,OAAO,IAAA;AAAA,IACX;AACA,IAAA,IAAA,CAAK,GAAA,KAAQ,YAAY,GAAA,KAAQ,WAAA,KAAgB,KAAK,eAAA,IAAmB,CAAC,KAAK,WAAA,EAAa;AACxF,MAAA,IAAA,CAAK,cAAA,EAAe;AACpB,MAAA,OAAO,IAAA;AAAA,IACX;AACA,IAAA,IAAI,GAAA,KAAQ,GAAA,IAAO,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAA,EAAG;AACxC,MAAA,IAAA,CAAK,IAAA,EAAK;AACV,MAAA,OAAO,IAAA;AAAA,IACX;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEA,cAAA,GAAuB;AACnB,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AAC3B,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,CAAA,KAAK,CAAA,KAAM,KAAK,eAAe,CAAA;AACpE,IAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AACrB,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACtB;AAAA,EAEA,IAAA,GAAa;AACT,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI;AAC9B,IAAA,IAAI,SAAS,MAAA,EAAW;AACpB,MAAA,IAAA,CAAK,UAAU,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,QAAQ,CAAC,CAAA;AACrD,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,MAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AACrB,MAAA,IAAA,CAAK,YAAA,EAAa;AAAA,IACtB;AAAA,EACJ;AAAA,EAEA,IAAA,GAAa;AACT,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,GAAA,EAAI;AAChC,IAAA,IAAI,SAAS,MAAA,EAAW;AACpB,MAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,QAAQ,CAAC,CAAA;AACnD,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,MAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AACrB,MAAA,IAAA,CAAK,YAAA,EAAa;AAAA,IACtB;AAAA,EACJ;AAAA,EAEA,OAAA,GAAgB;AACZ,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAChC,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,QAAA,EAAU,CAAA,CAAE,OAAA,GAAU,KAAA;AAC3C,IAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AACrB,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACtB;AAAA,EAEA,OAAA,GAAgB;AACZ,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAChC,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,QAAA,EAAU,CAAA,CAAE,OAAA,GAAU,IAAA;AAC3C,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACtB;AAAA,EAEA,OAAA,GAAgB;AACZ,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAChC,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,QAAA,EAAU,CAAA,CAAE,MAAA,GAAS,IAAA;AAC1C,IAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AACrB,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACtB;AAAA,EAEA,SAAA,GAAkB;AACd,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAChC,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,KAAA,MAAW,CAAA,IAAK,IAAA,CAAK,QAAA,EAAU,CAAA,CAAE,MAAA,GAAS,KAAA;AAC1C,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACtB;AAAA;AAAA,EAIA,MAAA,CACI,KACA,KAAA,EACA,QAAA,EACA,YACA,MAAA,EACA,MAAA,EACA,cAAA,GAAiB,CAAA,EACjB,KAAA,EACI;AACJ,IAAA,GAAA,CAAI,SAAA,CAAU,GAAG,CAAA,EAAG,GAAA,CAAI,OAAO,KAAA,EAAO,GAAA,CAAI,OAAO,MAAM,CAAA;AACvD,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAEhC,IAAA,MAAM,GAAA,GAAM,OAAO,gBAAA,IAAoB,CAAA;AACvC,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,KAAA,CAAM,KAAK,GAAG,CAAA;AAElB,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,QAAA,EAAU;AACjC,MAAA,IAAI,OAAA,CAAQ,YAAY,KAAA,EAAO;AAC/B,MAAA,OAAA,CAAQ,MAAA,CAAO,GAAA,EAAK,KAAA,EAAO,QAAA,EAAU,UAAA,EAAY,MAAA,EAAQ,MAAA,EAAQ,OAAA,KAAY,IAAA,CAAK,eAAA,EAAiB,cAAA,EAAgB,KAAK,CAAA;AAAA,IAC5H;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,EAChB;AAAA,EAEA,WAAA,GAA0B;AACtB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC5B;AAAA;AAAA,EAGA,mBAAA,GAA2C;AACvC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,MAC3B,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,MAAA,EAAQ,EAAE,MAAA,CAAO,GAAA,CAAI,QAAM,EAAE,GAAG,GAAE,CAAE,CAAA;AAAA,MACpC,UAAU,CAAA,CAAE,QAAA;AAAA,MACZ,GAAI,CAAA,CAAE,OAAA,KAAY,UAAa,EAAE,OAAA,EAAS,EAAE,OAAA,EAAQ;AAAA,MACpD,GAAI,CAAA,CAAE,MAAA,KAAW,UAAa,EAAE,MAAA,EAAQ,EAAE,MAAA,EAAO;AAAA,MACjD,GAAI,CAAA,CAAE,IAAA,KAAS,UAAa,EAAE,IAAA,EAAM,EAAE,IAAA,EAAK;AAAA,MAC3C,GAAI,CAAA,CAAE,KAAA,KAAU,MAAA,IAAa,EAAE,OAAO,EAAE,GAAG,CAAA,CAAE,KAAA,EAAM;AAAE,KACzD,CAAE,CAAA;AAAA,EACN;AAAA;AAAA,EAGA,aAAa,QAAA,EAAqC;AAC9C,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,CAAA,EAAA,KAAM;AAC/B,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,EAAA,CAAG,MAAM,EAAA,CAAG,MAAA,CAAO,CAAC,CAAA,IAAK,EAAE,QAAA,EAAU,CAAA,EAAG,KAAA,EAAO,GAAG,CAAA;AACrF,MAAA,OAAA,CAAQ,KAAK,EAAA,CAAG,EAAA;AAChB,MAAA,OAAA,CAAQ,MAAA,GAAS,GAAG,MAAA,CAAO,GAAA,CAAI,QAAM,EAAE,GAAG,GAAE,CAAE,CAAA;AAC9C,MAAA,OAAA,CAAQ,WAAW,EAAA,CAAG,QAAA;AACtB,MAAA,IAAI,EAAA,CAAG,OAAA,KAAY,MAAA,EAAW,OAAA,CAAQ,UAAU,EAAA,CAAG,OAAA;AACnD,MAAA,IAAI,EAAA,CAAG,MAAA,KAAW,MAAA,EAAW,OAAA,CAAQ,SAAS,EAAA,CAAG,MAAA;AACjD,MAAA,IAAI,EAAA,CAAG,IAAA,KAAS,MAAA,EAAW,OAAA,CAAQ,OAAO,EAAA,CAAG,IAAA;AAC7C,MAAA,IAAI,EAAA,CAAG,UAAU,MAAA,EAAW,OAAA,CAAQ,QAAQ,EAAE,GAAG,GAAG,KAAA,EAAM;AAC1D,MAAA,OAAO,OAAA;AAAA,IACX,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AACrB,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,IAAA,CAAK,OAAA,GAAU,CAAC,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,CAAA,MAAM,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,EAAE,MAAA,CAAO,GAAA,CAAI,QAAM,EAAE,GAAG,GAAE,CAAE,CAAA,GAAgB,CAAC,CAAA;AACrG,IAAA,IAAA,CAAK,YAAY,EAAC;AAAA,EACtB;AAAA;AAAA,EAIA,QAAA,GAAiB;AACb,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAChC,IAAA,IAAA,CAAK,QAAA,EAAS;AACd,IAAA,IAAA,CAAK,WAAW,EAAC;AACjB,IAAA,IAAA,CAAK,YAAY,IAAI,CAAA;AACrB,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACtB;AAAA,EAEQ,YAAA,GAAqB;AACzB,IAAA,IAAA,CAAK,gBAAA,IAAmB;AAAA,EAC5B;AAAA,EAEQ,QAAA,GAAiB;AACrB,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,QAAQ,CAAC,CAAA;AACnD,IAAA,IAAI,KAAK,OAAA,CAAQ,MAAA,GAAS,EAAA,EAAI,IAAA,CAAK,QAAQ,KAAA,EAAM;AACjD,IAAA,IAAA,CAAK,YAAY,EAAC;AAAA,EACtB;AAAA,EAEQ,cAAc,QAAA,EAAkC;AACpD,IAAA,OAAO,QAAA,CAAS,IAAI,CAAA,CAAA,KAAK;AACrB,MAAA,MAAM,QAAQ,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,CAAC,CAAC,CAAA;AACpD,MAAA,MAAA,CAAO,MAAA,CAAO,OAAO,CAAC,CAAA;AACtB,MAAA,KAAA,CAAM,MAAA,GAAS,EAAE,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAqB,EAAE,GAAG,CAAA,EAAE,CAAE,CAAA;AAC3D,MAAA,OAAO,KAAA;AAAA,IACX,CAAC,CAAA;AAAA,EACL;AAAA,EAEQ,aAAA,CAAc,MAAuB,KAAA,EAA+B;AACxE,IAAA,QAAQ,IAAA;AAAM;AAAA,MAEV,KAAK,gBAAA;AAAoB,QAAA,OAAO,IAAI,eAAe,KAAK,CAAA;AAAA,MACxD,KAAK,cAAA;AAAoB,QAAA,OAAO,IAAI,aAAa,KAAK,CAAA;AAAA,MACtD,KAAK,WAAA;AAAoB,QAAA,OAAO,IAAI,UAAU,KAAK,CAAA;AAAA,MACnD,KAAK,YAAA;AAAoB,QAAA,OAAO,IAAI,WAAW,KAAK,CAAA;AAAA,MACpD,KAAK,WAAA;AAAoB,QAAA,OAAO,IAAI,UAAU,KAAK,CAAA;AAAA,MACnD,KAAK,iBAAA;AAAoB,QAAA,OAAO,IAAI,gBAAgB,KAAK,CAAA;AAAA,MACzD,KAAK,aAAA;AAAoB,QAAA,OAAO,IAAI,YAAY,KAAK,CAAA;AAAA,MACrD,KAAK,iBAAA;AAAoB,QAAA,OAAO,IAAI,gBAAgB,KAAK,CAAA;AAAA;AAAA,MAEzD,KAAK,gBAAA;AAAoB,QAAA,OAAO,IAAI,eAAe,KAAK,CAAA;AAAA,MACxD,KAAK,cAAA;AAAoB,QAAA,OAAO,IAAI,aAAa,KAAK,CAAA;AAAA,MACtD,KAAK,YAAA;AAAoB,QAAA,OAAO,IAAI,WAAW,KAAK,CAAA;AAAA,MACpD,KAAK,aAAA;AAAoB,QAAA,OAAO,IAAI,YAAY,KAAK,CAAA;AAAA,MACrD,KAAK,YAAA;AAAoB,QAAA,OAAO,IAAI,WAAW,KAAK,CAAA;AAAA,MACpD,KAAK,WAAA;AAAoB,QAAA,OAAO,IAAI,UAAU,KAAK,CAAA;AAAA,MACnD,KAAK,QAAA;AAAoB,QAAA,OAAO,IAAI,OAAO,KAAK,CAAA;AAAA,MAChD,KAAK,eAAA;AAAoB,QAAA,OAAO,IAAI,cAAc,KAAK,CAAA;AAAA,MACvD,KAAK,SAAA;AAAoB,QAAA,OAAO,IAAI,QAAQ,KAAK,CAAA;AAAA,MACjD,KAAK,YAAA;AAAoB,QAAA,OAAO,IAAI,WAAW,KAAK,CAAA;AAAA,MACpD,KAAK,SAAA;AAAoB,QAAA,OAAO,IAAI,QAAQ,KAAK,CAAA;AAAA;AAAA,MAEjD,KAAK,WAAA;AAAoB,QAAA,OAAO,IAAI,UAAU,KAAK,CAAA;AAAA,MACnD,KAAK,kBAAA;AAAoB,QAAA,OAAO,IAAI,iBAAiB,KAAK,CAAA;AAAA,MAC1D,KAAK,SAAA;AAAoB,QAAA,OAAO,IAAI,QAAQ,KAAK,CAAA;AAAA,MACjD,KAAK,UAAA;AAAoB,QAAA,OAAO,IAAI,SAAS,KAAK,CAAA;AAAA,MAClD,KAAK,QAAA;AAAoB,QAAA,OAAO,IAAI,OAAO,KAAK,CAAA;AAAA,MAChD,KAAK,KAAA;AAAoB,QAAA,OAAO,IAAI,IAAI,KAAK,CAAA;AAAA,MAC7C,KAAK,UAAA;AAAoB,QAAA,OAAO,IAAI,SAAS,KAAK,CAAA;AAAA,MAClD,KAAK,MAAA;AAAoB,QAAA,OAAO,IAAI,KAAK,KAAK,CAAA;AAAA;AAAA,MAE9C,KAAK,YAAA;AAAoB,QAAA,OAAO,IAAI,WAAW,KAAK,CAAA;AAAA,MACpD,KAAK,WAAA;AAAoB,QAAA,OAAO,IAAI,UAAU,KAAK,CAAA;AAAA,MACnD,KAAK,gBAAA;AAAoB,QAAA,OAAO,IAAI,eAAe,KAAK,CAAA;AAAA,MACxD,KAAK,OAAA;AAAoB,QAAA,OAAO,IAAI,MAAM,KAAK,CAAA;AAAA;AAAA,MAE/C,KAAK,WAAA;AAAoB,QAAA,OAAO,IAAI,UAAU,KAAK,CAAA;AAAA,MACnD,KAAK,iBAAA;AAAoB,QAAA,OAAO,IAAI,gBAAgB,KAAK,CAAA;AAAA,MACzD,KAAK,gBAAA;AAAoB,QAAA,OAAO,IAAI,eAAe,KAAK,CAAA;AAAA,MACxD,KAAK,iBAAA;AAAoB,QAAA,OAAO,IAAI,gBAAgB,KAAK,CAAA;AAAA;AAAA,MAEzD,KAAK,cAAA;AAAoB,QAAA,OAAO,IAAI,aAAa,KAAK,CAAA;AAAA,MACtD,KAAK,YAAA;AAAoB,QAAA,OAAO,IAAI,WAAW,KAAK,CAAA;AAAA,MACpD,KAAK,eAAA;AAAoB,QAAA,OAAO,IAAI,cAAc,KAAK,CAAA;AAAA,MACvD,KAAK,iBAAA;AAAoB,QAAA,OAAO,IAAI,gBAAgB,KAAK,CAAA;AAAA;AAAA,MAEzD,KAAK,MAAA;AAAoB,QAAA,OAAO,IAAI,KAAK,KAAK,CAAA;AAAA,MAC9C,KAAK,SAAA;AAAoB,QAAA,OAAO,IAAI,QAAQ,KAAK,CAAA;AAAA,MACjD,KAAK,YAAA;AAAoB,QAAA,OAAO,IAAI,WAAW,KAAK,CAAA;AAAA,MACpD,KAAK,aAAA;AAAoB,QAAA,OAAO,IAAI,YAAY,KAAK,CAAA;AAAA,MACrD,KAAK,MAAA;AAAoB,QAAA,OAAO,IAAI,KAAK,KAAK,CAAA;AAAA,MAC9C,KAAK,WAAA;AAAoB,QAAA,OAAO,IAAI,UAAU,KAAK,CAAA;AAAA,MACnD,KAAK,cAAA;AAAoB,QAAA,OAAO,IAAI,aAAa,KAAK,CAAA;AAAA,MACtD,KAAK,SAAA;AAAoB,QAAA,OAAO,IAAI,QAAQ,KAAK,CAAA;AAAA,MACjD,KAAK,WAAA;AAAoB,QAAA,OAAO,IAAI,UAAU,KAAK,CAAA;AAAA;AAAA,MAEnD,KAAK,eAAA;AAAoB,QAAA,OAAO,IAAI,cAAc,KAAK,CAAA;AAAA,MACvD,KAAK,iBAAA;AAAoB,QAAA,OAAO,IAAI,gBAAgB,KAAK,CAAA;AAAA,MACzD,KAAK,aAAA;AAAoB,QAAA,OAAO,IAAI,YAAY,KAAK,CAAA;AAAA,MACrD,KAAK,aAAA;AAAoB,QAAA,OAAO,IAAI,YAAY,KAAK,CAAA;AAAA,MACrD,KAAK,eAAA;AAAoB,QAAA,OAAO,IAAI,cAAc,KAAK,CAAA;AAAA,MACvD,KAAK,kBAAA;AAAoB,QAAA,OAAO,IAAI,iBAAiB,KAAK,CAAA;AAAA,MAC1D,KAAK,YAAA;AAAoB,QAAA,OAAO,IAAI,WAAW,KAAK,CAAA;AAAA,MACpD,KAAK,gBAAA;AAAoB,QAAA,OAAO,IAAI,eAAe,KAAK,CAAA;AAAA,MACxD,KAAK,aAAA;AAAoB,QAAA,OAAO,IAAI,YAAY,KAAK,CAAA;AAAA,MACrD,KAAK,cAAA;AAAoB,QAAA,OAAO,IAAI,aAAa,KAAK,CAAA;AAAA;AAAA,MAEtD,KAAK,gBAAA;AAAsB,QAAA,OAAO,IAAI,eAAe,KAAK,CAAA;AAAA,MAC1D,KAAK,mBAAA;AAAsB,QAAA,OAAO,IAAI,kBAAkB,KAAK,CAAA;AAAA,MAC7D,KAAK,iBAAA;AAAsB,QAAA,OAAO,IAAI,gBAAgB,KAAK,CAAA;AAAA,MAC3D,KAAK,oBAAA;AAAsB,QAAA,OAAO,IAAI,mBAAmB,KAAK,CAAA;AAAA,MAC9D,KAAK,YAAA;AAAsB,QAAA,OAAO,IAAI,WAAW,KAAK,CAAA;AAAA;AAAA,MAEtD,KAAK,OAAA;AAAoB,QAAA,OAAO,IAAI,MAAM,KAAK,CAAA;AAAA,MAC/C,KAAK,aAAA;AAAoB,QAAA,OAAO,IAAI,YAAY,KAAK,CAAA;AAAA;AAAA,MAErD,KAAK,UAAA;AAAoB,QAAA,OAAO,IAAI,SAAS,KAAK,CAAA;AAAA,MAClD,KAAK,aAAA;AAAoB,QAAA,OAAO,IAAI,YAAY,KAAK,CAAA;AAAA,MACrD,KAAK,YAAA;AAAoB,QAAA,OAAO,IAAI,WAAW,KAAK,CAAA;AAAA,MACpD,KAAK,YAAA;AAAoB,QAAA,OAAO,IAAI,WAAW,KAAK,CAAA;AAAA,MACpD,KAAK,iBAAA;AAAoB,QAAA,OAAO,IAAI,gBAAgB,KAAK,CAAA;AAAA,MACzD,KAAK,WAAA;AAAoB,QAAA,OAAO,IAAI,UAAU,KAAK,CAAA;AAAA,MACnD;AAAyB,QAAA,OAAO,IAAI,UAAU,KAAK,CAAA;AAAA;AACvD,EACJ;AACJ;;;AChqBA,IAAM,UAAA,GAAa,CAAA;AAYZ,IAAM,mBAAN,MAAuB;AAAA,EAY1B,YACI,KAAA,EACA,GAAA,GAAmC,gCAAA,EACnC,MAAA,GAAkC,eAAe,KAAA,EACnD;AAXF,IAAA,IAAA,CAAQ,KAAA,uBAAY,GAAA,EAAuB;AAK3C,IAAA,IAAA,CAAQ,MAAA,GAAS,KAAA;AAyXjB,IAAA,IAAA,CAAQ,UAAA,GAAa,CAAC,CAAA,KAAwB;AAC1C,MAAA,IAAI,IAAA,CAAK,UAAU,CAAC,IAAA,CAAK,GAAG,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,EAAG;AACpD,QAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,QAAA,IAAA,CAAK,aAAA,CAAc,MAAM,OAAA,GAAU,MAAA;AACnC,QAAA,IAAA,CAAK,WAAA,CAAY,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,OAAA,CAAQ,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,MACrG;AAAA,IACJ,CAAA;AAxXI,IAAA,IAAA,CAAK,KAAA,GAAS,KAAA;AACd,IAAA,IAAA,CAAK,GAAA,GAAS,GAAA;AACd,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAEd,IAAA,IAAA,CAAK,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACtC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO;AAAA,MACzB,QAAA,EAAe,UAAA;AAAA,MACf,GAAA,EAAe,MAAA;AAAA,MACf,IAAA,EAAe,KAAA;AAAA,MACf,MAAA,EAAe,IAAA;AAAA,MACf,OAAA,EAAe,MAAA;AAAA,MACf,UAAA,EAAe,QAAA;AAAA,MACf,GAAA,EAAe,MAAA;AAAA,MACf,aAAA,EAAe;AAAA,KAClB,CAAA;AAED,IAAA,IAAA,CAAK,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC7C,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO;AAAA,MAChC,OAAA,EAAY,MAAA;AAAA,MACZ,UAAA,EAAY,QAAA;AAAA,MACZ,GAAA,EAAY;AAAA,KACf,CAAA;AAED,IAAA,IAAA,CAAK,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAClD,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO;AAAA,MAClC,OAAA,EAAc,MAAA;AAAA,MACd,UAAA,EAAc,QAAA;AAAA,MACd,GAAA,EAAc,KAAA;AAAA,MACd,UAAA,EAAc,IAAA,CAAK,KAAA,CAAM,gBAAA,CAAiB,MAAA;AAAA,MAC1C,KAAA,EAAc,KAAK,KAAA,CAAM,QAAA;AAAA,MACzB,MAAA,EAAc,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MAChD,YAAA,EAAc,KAAA;AAAA,MACd,OAAA,EAAc,SAAA;AAAA,MACd,QAAA,EAAc,KAAK,GAAA,CAAI,mBAAA;AAAA,MACvB,UAAA,EAAc,KAAK,GAAA,CAAI,qBAAA;AAAA,MACvB,MAAA,EAAc,SAAA;AAAA,MACd,OAAA,EAAc;AAAA,KACjB,CAAA;AACD,IAAA,IAAA,CAAK,WAAA,CAAY,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AAC9C,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,IAAA,CAAK,cAAA,EAAe;AAAA,IACxB,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,aAAA,GAAgB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACjD,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO;AAAA,MACpC,OAAA,EAAc,MAAA;AAAA,MACd,QAAA,EAAc,UAAA;AAAA,MACd,GAAA,EAAc,MAAA;AAAA,MACd,IAAA,EAAc,GAAA;AAAA,MACd,SAAA,EAAc,KAAA;AAAA,MACd,UAAA,EAAc,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,UAAA;AAAA,MACjC,MAAA,EAAc,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MAChD,YAAA,EAAc,KAAA;AAAA,MACd,OAAA,EAAc,OAAA;AAAA,MACd,QAAA,EAAc,OAAA;AAAA,MACd,MAAA,EAAc,IAAA;AAAA,MACd,SAAA,EAAc;AAAA,KACjB,CAAA;AAED,IAAA,MAAM,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACjD,IAAA,MAAA,CAAO,OAAO,YAAA,CAAa,KAAA,EAAO,EAAE,QAAA,EAAU,YAAY,CAAA;AAC1D,IAAA,YAAA,CAAa,MAAA,CAAO,IAAA,CAAK,WAAA,EAAa,IAAA,CAAK,aAAa,CAAA;AAExD,IAAA,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,IAAA,CAAK,SAAA,EAAW,YAAY,CAAA;AAE3C,IAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,IAAA,CAAK,UAAU,CAAA;AAAA,EACtD;AAAA;AAAA,EAIA,OAAA,CACI,IAAA,EACA,KAAA,EACA,KAAA,EACA,SAAA,GAAoB,OAAA,EACpB,OAAA,GAAmB,IAAA,EACnB,QAAA,EACA,MAAA,GAA8B,IAAA,EAC9B,kBAAA,EACI;AACJ,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA,EAAG;AAC1B,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,EAAM,EAAE,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,QAAA,EAAU,MAAA,EAAQ,kBAAA,EAAoB,CAAA;AAC/F,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACjB;AAAA,EAEA,eAAA,CAAgB,MAAc,QAAA,EAAwB;AAClD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AACjC,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,KAAA,CAAM,KAAA,GAAQ,QAAA;AACd,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACjB;AAAA,EAEA,eAAA,CAAgB,MAAc,KAAA,EAAqB;AAC/C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AACjC,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AACd,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACjB;AAAA,EAEA,mBAAA,CAAoB,MAAc,SAAA,EAAyB;AACvD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AACjC,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,KAAA,CAAM,SAAA,GAAY,SAAA;AAClB,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACjB;AAAA,EAEA,oBAAA,CAAqB,MAAc,OAAA,EAAwB;AACvD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AACjC,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,KAAA,CAAM,OAAA,GAAU,OAAA;AAChB,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACjB;AAAA,EAEA,WAAW,IAAA,EAAoB;AAC3B,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA,EAAG;AAC3B,IAAA,IAAA,CAAK,KAAA,CAAM,OAAO,IAAI,CAAA;AACtB,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACjB;AAAA,EAEA,SAAS,KAAA,EAAyB;AAC9B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO;AAAA,MAClC,UAAA,EAAY,MAAM,gBAAA,CAAiB,MAAA;AAAA,MACnC,OAAY,KAAA,CAAM,QAAA;AAAA,MAClB,MAAA,EAAY,CAAA,UAAA,EAAa,KAAA,CAAM,UAAU,CAAA;AAAA,KAC5C,CAAA;AACD,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO;AAAA,MACpC,UAAA,EAAY,MAAM,OAAA,CAAQ,UAAA;AAAA,MAC1B,MAAA,EAAY,CAAA,UAAA,EAAa,KAAA,CAAM,UAAU,CAAA;AAAA,KAC5C,CAAA;AACD,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACjB;AAAA,EAEA,OAAA,GAAgB;AACZ,IAAA,QAAA,CAAS,mBAAA,CAAoB,OAAA,EAAS,IAAA,CAAK,UAAU,CAAA;AAAA,EACzD;AAAA;AAAA,EAIQ,OAAA,GAAgB;AACpB,IAAA,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAC/C,IAAA,IAAA,CAAK,UAAU,SAAA,GAAY,EAAA;AAC3B,IAAA,IAAA,CAAK,cAAc,SAAA,GAAY,EAAA;AAE/B,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACtB,MAAA,IAAA,CAAK,EAAA,CAAG,MAAM,OAAA,GAAU,MAAA;AACxB,MAAA,IAAA,CAAK,WAAA,CAAY,MAAM,OAAA,GAAU,MAAA;AACjC,MAAA;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,EAAA,CAAG,MAAM,OAAA,GAAU,MAAA;AAExB,IAAA,IAAI,OAAA,CAAQ,UAAU,UAAA,EAAY;AAC9B,MAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,MAAA,IAAA,CAAK,aAAA,CAAc,MAAM,OAAA,GAAU,MAAA;AACnC,MAAA,IAAA,CAAK,WAAA,CAAY,MAAM,OAAA,GAAU,MAAA;AACjC,MAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,OAAA,EAAS;AACjC,QAAA,IAAA,CAAK,UAAU,WAAA,CAAY,IAAA,CAAK,QAAA,CAAS,IAAA,EAAM,KAAK,CAAC,CAAA;AAAA,MACzD;AAAA,IACJ,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,WAAA,CAAY,MAAM,OAAA,GAAU,aAAA;AACjC,MAAA,IAAA,CAAK,WAAA,CAAY,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,QAAQ,SAAA,EAAW,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAC,CAAA;AAChG,MAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,OAAA,EAAS;AACjC,QAAA,IAAA,CAAK,cAAc,WAAA,CAAY,IAAA,CAAK,eAAA,CAAgB,IAAA,EAAM,KAAK,CAAC,CAAA;AAAA,MACpE;AACA,MAAA,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,SAAS,OAAA,GAAU,MAAA;AAAA,IAC/D;AAAA,EACJ;AAAA,EAEQ,mBAAmB,SAAA,EAA2C;AAClE,IAAA,IAAI,CAAC,SAAA,IAAa,SAAA,KAAc,OAAA,EAAS,OAAO,IAAA;AAChD,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC3C,IAAA,KAAA,CAAM,WAAA,GAAc,SAAA;AACpB,IAAA,MAAA,CAAO,MAAA,CAAO,MAAM,KAAA,EAAO;AAAA,MACvB,QAAA,EAAc,MAAA;AAAA,MACd,OAAA,EAAc,SAAA;AAAA,MACd,YAAA,EAAc,KAAA;AAAA,MACd,UAAA,EAAc,wBAAA;AAAA,MACd,KAAA,EAAc,KAAK,KAAA,CAAM,QAAA;AAAA,MACzB,UAAA,EAAc,KAAA;AAAA,MACd,UAAA,EAAc;AAAA,KACjB,CAAA;AACD,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEQ,YAAY,KAAA,EAAmC;AACnD,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AACzC,IAAA,GAAA,CAAI,SAAA,GAAY,KAAA,CAAM,OAAA,GAAU,QAAA,GAAW,YAAA;AAC3C,IAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,MACrB,OAAA,EAAY,aAAA;AAAA,MACZ,UAAA,EAAY,QAAA;AAAA,MACZ,KAAA,EAAY,IAAA,CAAK,KAAA,CAAM,gBAAA,CAAiB,SAAA;AAAA,MACxC,MAAA,EAAY,SAAA;AAAA,MACZ,OAAA,EAAY,KAAA,CAAM,OAAA,GAAU,KAAA,GAAQ,KAAA;AAAA,MACpC,UAAA,EAAY;AAAA,KACf,CAAA;AACD,IAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AAAE,MAAA,GAAA,CAAI,MAAM,OAAA,GAAU,GAAA;AAAA,IAAK,CAAC,CAAA;AACrE,IAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AAAE,MAAA,GAAA,CAAI,KAAA,CAAM,OAAA,GAAU,KAAA,CAAM,OAAA,GAAU,KAAA,GAAQ,KAAA;AAAA,IAAO,CAAC,CAAA;AAC/F,IAAA,GAAA,CAAI,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,MAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,MAAA,KAAA,CAAM,kBAAA,EAAmB;AAAA,IAAG,CAAC,CAAA;AACzF,IAAA,OAAO,GAAA;AAAA,EACX;AAAA,EAEQ,QAAA,CAAS,OAAe,KAAA,EAAmC;AAC/D,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,IAAA,MAAA,CAAO,MAAA,CAAO,KAAK,KAAA,EAAO;AAAA,MACtB,OAAA,EAAc,aAAA;AAAA,MACd,UAAA,EAAc,QAAA;AAAA,MACd,GAAA,EAAc,KAAA;AAAA,MACd,QAAA,EAAc,KAAK,GAAA,CAAI,YAAA;AAAA,MACvB,UAAA,EAAc,KAAK,GAAA,CAAI,cAAA;AAAA,MACvB,OAAc,KAAA,CAAM,KAAA;AAAA,MACpB,UAAA,EAAc,QAAA;AAAA,MACd,UAAA,EAAc,MAAA;AAAA,MACd,UAAA,EAAc,IAAA,CAAK,KAAA,CAAM,gBAAA,CAAiB,MAAA;AAAA,MAC1C,YAAA,EAAc,KAAA;AAAA,MACd,OAAA,EAAc,iBAAA;AAAA,MACd,OAAA,EAAc,KAAA,CAAM,OAAA,GAAU,GAAA,GAAM;AAAA,KACvC,CAAA;AAED,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AACzC,IAAA,GAAA,CAAI,SAAA,GAAY,WAAA;AAChB,IAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO,EAAE,SAAS,aAAA,EAAe,UAAA,EAAY,UAAU,CAAA;AAEzE,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AACzC,IAAA,GAAA,CAAI,cAAc,KAAA,CAAM,KAAA;AAExB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,kBAAA,CAAmB,KAAA,CAAM,SAAS,CAAA;AAErD,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC7C,IAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,KAAA,EAAO;AAAA,MACzB,OAAA,EAAY,aAAA;AAAA,MACZ,UAAA,EAAY,QAAA;AAAA,MACZ,GAAA,EAAY,KAAA;AAAA,MACZ,UAAA,EAAY;AAAA,KACf,CAAA;AAED,IAAA,OAAA,CAAQ,WAAA,CAAY,IAAA,CAAK,WAAA,CAAY,KAAK,CAAC,CAAA;AAE3C,IAAA,IAAI,MAAM,MAAA,EAAQ;AACd,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,MAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,MAAA,MAAA,CAAO,MAAA,CAAO,KAAK,KAAA,EAAO;AAAA,QACtB,OAAA,EAAY,aAAA;AAAA,QACZ,UAAA,EAAY,QAAA;AAAA,QACZ,KAAA,EAAY,IAAA,CAAK,KAAA,CAAM,gBAAA,CAAiB,SAAA;AAAA,QACxC,MAAA,EAAY,SAAA;AAAA,QACZ,OAAA,EAAY,KAAA;AAAA,QACZ,UAAA,EAAY;AAAA,OACf,CAAA;AACD,MAAA,IAAA,CAAK,gBAAA,CAAiB,cAAc,MAAM;AAAE,QAAA,IAAA,CAAK,MAAM,OAAA,GAAU,GAAA;AAAA,MAAK,CAAC,CAAA;AACvE,MAAA,IAAA,CAAK,gBAAA,CAAiB,cAAc,MAAM;AAAE,QAAA,IAAA,CAAK,MAAM,OAAA,GAAU,KAAA;AAAA,MAAO,CAAC,CAAA;AACzE,MAAA,IAAA,CAAK,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,QAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,QAAA,KAAA,CAAM,MAAA,EAAQ;AAAA,MAAG,CAAC,CAAA;AAC/E,MAAA,OAAA,CAAQ,YAAY,IAAI,CAAA;AAAA,IAC5B;AAEA,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AACvC,IAAA,CAAA,CAAE,SAAA,GAAY,UAAA;AACd,IAAA,MAAA,CAAO,MAAA,CAAO,EAAE,KAAA,EAAO;AAAA,MACnB,OAAA,EAAY,aAAA;AAAA,MACZ,UAAA,EAAY,QAAA;AAAA,MACZ,KAAA,EAAY,IAAA,CAAK,KAAA,CAAM,gBAAA,CAAiB,SAAA;AAAA,MACxC,MAAA,EAAY;AAAA,KACf,CAAA;AACD,IAAA,CAAA,CAAE,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,MAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,MAAA,KAAA,CAAM,QAAA,EAAS;AAAA,IAAG,CAAC,CAAA;AAC7E,IAAA,OAAA,CAAQ,YAAY,CAAC,CAAA;AAErB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,GAAG,CAAA;AACpB,IAAA,IAAI,KAAA,EAAO,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA;AACjC,IAAA,IAAA,CAAK,YAAY,OAAO,CAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEQ,eAAA,CAAgB,OAAe,KAAA,EAAkC;AACrE,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,MACrB,OAAA,EAAgB,MAAA;AAAA,MAChB,UAAA,EAAgB,QAAA;AAAA,MAChB,cAAA,EAAgB,eAAA;AAAA,MAChB,GAAA,EAAgB,KAAA;AAAA,MAChB,OAAA,EAAgB,UAAA;AAAA,MAChB,QAAA,EAAgB,KAAK,GAAA,CAAI,mBAAA;AAAA,MACzB,UAAA,EAAgB,KAAK,GAAA,CAAI,qBAAA;AAAA,MACzB,OAAgB,KAAA,CAAM,KAAA;AAAA,MACtB,MAAA,EAAgB,SAAA;AAAA,MAChB,OAAA,EAAgB,KAAA,CAAM,OAAA,GAAU,GAAA,GAAM;AAAA,KACzC,CAAA;AACD,IAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AAAE,MAAA,GAAA,CAAI,KAAA,CAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,gBAAA,CAAiB,eAAA;AAAA,IAAiB,CAAC,CAAA;AAChH,IAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AAAE,MAAA,GAAA,CAAI,MAAM,UAAA,GAAa,aAAA;AAAA,IAAe,CAAC,CAAA;AAElF,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AACzC,IAAA,GAAA,CAAI,SAAA,GAAY,WAAA;AAChB,IAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO,EAAE,SAAS,aAAA,EAAe,UAAA,EAAY,UAAU,CAAA;AAEzE,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC9C,IAAA,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,EAAE,OAAA,EAAS,aAAA,EAAe,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,KAAA,EAAO,IAAA,EAAM,GAAA,EAAK,CAAA;AAErG,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AACzC,IAAA,GAAA,CAAI,cAAc,KAAA,CAAM,KAAA;AACxB,IAAA,QAAA,CAAS,YAAY,GAAG,CAAA;AAExB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,kBAAA,CAAmB,KAAA,CAAM,SAAS,CAAA;AACrD,IAAA,IAAI,KAAA,EAAO,QAAA,CAAS,WAAA,CAAY,KAAK,CAAA;AAErC,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC7C,IAAA,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,EAAE,OAAA,EAAS,eAAe,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,KAAA,EAAO,CAAA;AAEzF,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AACzC,IAAA,GAAA,CAAI,SAAA,GAAY,KAAA,CAAM,OAAA,GAAU,QAAA,GAAW,YAAA;AAC3C,IAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,MACrB,OAAA,EAAY,aAAA;AAAA,MACZ,UAAA,EAAY,QAAA;AAAA,MACZ,KAAA,EAAY,IAAA,CAAK,KAAA,CAAM,gBAAA,CAAiB,SAAA;AAAA,MACxC,MAAA,EAAY,SAAA;AAAA,MACZ,OAAA,EAAY,KAAA,CAAM,OAAA,GAAU,KAAA,GAAQ,KAAA;AAAA,MACpC,UAAA,EAAY;AAAA,KACf,CAAA;AACD,IAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AAAE,MAAA,GAAA,CAAI,MAAM,OAAA,GAAU,GAAA;AAAA,IAAK,CAAC,CAAA;AACrE,IAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AAAE,MAAA,GAAA,CAAI,KAAA,CAAM,OAAA,GAAU,KAAA,CAAM,OAAA,GAAU,KAAA,GAAQ,KAAA;AAAA,IAAO,CAAC,CAAA;AAC/F,IAAA,GAAA,CAAI,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACjC,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,KAAA,CAAM,kBAAA,EAAmB;AAAA,IAC7B,CAAC,CAAA;AACD,IAAA,OAAA,CAAQ,YAAY,GAAG,CAAA;AAEvB,IAAA,IAAI,MAAM,MAAA,EAAQ;AACd,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,MAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,MAAA,MAAA,CAAO,MAAA,CAAO,KAAK,KAAA,EAAO;AAAA,QACtB,OAAA,EAAY,aAAA;AAAA,QACZ,UAAA,EAAY,QAAA;AAAA,QACZ,KAAA,EAAY,IAAA,CAAK,KAAA,CAAM,gBAAA,CAAiB,SAAA;AAAA,QACxC,MAAA,EAAY,SAAA;AAAA,QACZ,OAAA,EAAY,KAAA;AAAA,QACZ,UAAA,EAAY;AAAA,OACf,CAAA;AACD,MAAA,IAAA,CAAK,gBAAA,CAAiB,cAAc,MAAM;AAAE,QAAA,IAAA,CAAK,MAAM,OAAA,GAAU,GAAA;AAAA,MAAK,CAAC,CAAA;AACvE,MAAA,IAAA,CAAK,gBAAA,CAAiB,cAAc,MAAM;AAAE,QAAA,IAAA,CAAK,MAAM,OAAA,GAAU,KAAA;AAAA,MAAO,CAAC,CAAA;AACzE,MAAA,IAAA,CAAK,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AAClC,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,QAAA,IAAA,CAAK,aAAA,CAAc,MAAM,OAAA,GAAU,MAAA;AACnC,QAAA,KAAA,CAAM,MAAA,EAAQ;AAAA,MAClB,CAAC,CAAA;AACD,MAAA,OAAA,CAAQ,YAAY,IAAI,CAAA;AAAA,IAC5B;AAEA,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AACvC,IAAA,CAAA,CAAE,SAAA,GAAY,UAAA;AACd,IAAA,MAAA,CAAO,MAAA,CAAO,EAAE,KAAA,EAAO;AAAA,MACnB,OAAA,EAAY,aAAA;AAAA,MACZ,UAAA,EAAY,QAAA;AAAA,MACZ,KAAA,EAAY,IAAA,CAAK,KAAA,CAAM,gBAAA,CAAiB,SAAA;AAAA,MACxC,MAAA,EAAY;AAAA,KACf,CAAA;AACD,IAAA,CAAA,CAAE,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AAC/B,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,KAAA,CAAM,QAAA,EAAS;AAAA,IACnB,CAAC,CAAA;AACD,IAAA,OAAA,CAAQ,YAAY,CAAC,CAAA;AAErB,IAAA,GAAA,CAAI,MAAA,CAAO,GAAA,EAAK,QAAA,EAAU,OAAO,CAAA;AACjC,IAAA,OAAO,GAAA;AAAA,EACX;AAAA,EAEQ,cAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,MAAA,GAAS,CAAC,IAAA,CAAK,MAAA;AACpB,IAAA,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,SAAS,OAAA,GAAU,MAAA;AAC3D,IAAA,IAAA,CAAK,WAAA,CAAY,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,OAAA,CAAQ,SAAA,EAAW,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,EACrG;AASJ,CAAA;;;ACpZO,IAAM,0BAAN,MAA8B;AAAA,EAejC,WAAA,CACI,KAAA,EACA,MAAA,GAAuB,cAAA,CAAe,SACtC,kBAAA,EACF;AAZF,IAAA,IAAA,CAAQ,MAAA,GAAsC,IAAA;AAC9C,IAAA,IAAA,CAAQ,gBAAiC,EAAC;AAC1C,IAAA,IAAA,CAAQ,QAAA,GAAuD,IAAA;AAC/D,IAAA,IAAA,CAAQ,QAAA,GAAgC,IAAA;AACxC,IAAA,IAAA,CAAQ,SAAA,uBAAgB,GAAA,EAAkD;AAC1E,IAAA,IAAA,CAAQ,aAAyB,MAAM;AAAA,IAAC,CAAA;AAQpC,IAAA,IAAA,CAAK,KAAA,GAAS,KAAA;AACd,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,kBAAA,GAAqB,kBAAA;AAG1B,IAAA,IAAA,CAAK,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACtC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO;AAAA,MACzB,QAAA,EAAgB,OAAA;AAAA,MAChB,KAAA,EAAgB,GAAA;AAAA,MAChB,UAAA,EAAgB,iBAAA;AAAA,MAChB,OAAA,EAAgB,MAAA;AAAA,MAChB,UAAA,EAAgB,QAAA;AAAA,MAChB,cAAA,EAAgB,QAAA;AAAA,MAChB,MAAA,EAAgB;AAAA,KACnB,CAAA;AACD,IAAA,IAAA,CAAK,EAAA,CAAG,gBAAA,CAAiB,WAAA,EAAa,CAAC,CAAA,KAAM;AACzC,MAAA,IAAI,CAAA,CAAE,MAAA,KAAW,IAAA,CAAK,EAAA,OAAS,IAAA,EAAK;AAAA,IACxC,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO;AAAA,MAC5B,OAAA,EAAe,MAAA;AAAA,MACf,aAAA,EAAe,QAAA;AAAA,MACf,QAAA,EAAe,OAAA;AAAA,MACf,QAAA,EAAe,OAAA;AAAA,MACf,UAAA,EAAe,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,UAAA;AAAA,MAClC,MAAA,EAAe,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MACjD,YAAA,EAAe,KAAA;AAAA,MACf,SAAA,EAAe,6BAAA;AAAA,MACf,UAAA,EAAY,gCAAA;AAAA,MACZ,QAAA,EAAe,MAAA;AAAA,MACf,QAAA,EAAe;AAAA,KAClB,CAAA;AAED,IAAA,IAAA,CAAK,MAAM,gBAAA,CAAiB,WAAA,EAAa,CAAC,CAAA,KAAM,CAAA,CAAE,iBAAiB,CAAA;AAEnE,IAAA,IAAA,CAAK,EAAA,CAAG,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA;AAE9B,IAAA,IAAA,CAAK,UAAA,GAAa,wBAAA,CAAyB,IAAA,CAAK,KAAK,CAAA;AAAA,EACzD;AAAA;AAAA,EAIA,IAAA,CACI,MAAA,EACA,aAAA,EACA,QAAA,EACA,QAAA,EACI;AACJ,IAAA,MAAM,aAAa,IAAA,CAAK,SAAA;AACxB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,aAAA,GAAgB,EAAE,GAAG,aAAA,EAAc;AACxC,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,IAAA,CAAK,EAAA,CAAG,MAAM,OAAA,GAAU,MAAA;AACxB,IAAA,IAAI,CAAC,UAAA,EAAY,IAAA,CAAK,kBAAA,IAAqB;AAAA,EAC/C;AAAA,EAEA,IAAA,GAAa;AACT,IAAA,MAAM,aAAa,IAAA,CAAK,SAAA;AACxB,IAAA,IAAA,CAAK,EAAA,CAAG,MAAM,OAAA,GAAU,MAAA;AACxB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAI,UAAA,OAAiB,kBAAA,IAAqB;AAAA,EAC9C;AAAA,EAEA,IAAI,SAAA,GAAqB;AACrB,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,OAAA,KAAY,MAAA;AAAA,EACrC;AAAA,EAEA,SAAS,KAAA,EAAyB;AAC9B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO;AAAA,MAC5B,UAAA,EAAY,MAAM,OAAA,CAAQ,UAAA;AAAA,MAC1B,MAAA,EAAY,CAAA,UAAA,EAAa,KAAA,CAAM,UAAU,CAAA;AAAA,KAC5C,CAAA;AAED,IAAA,IAAI,KAAK,EAAA,CAAG,KAAA,CAAM,OAAA,KAAY,MAAA,IAAU,KAAK,MAAA,EAAQ;AACjD,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACjB;AAAA,EACJ;AAAA,EAEA,OAAA,GAAgB;AACZ,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,IAAA,CAAK,GAAG,MAAA,EAAO;AAAA,EACnB;AAAA;AAAA,EAIQ,OAAA,GAAgB;AACpB,IAAA,IAAA,CAAK,MAAM,SAAA,GAAY,EAAA;AACvB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,IAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAElB,IAAA,IAAA,CAAK,MAAM,WAAA,CAAY,IAAA,CAAK,YAAY,IAAA,CAAK,MAAA,CAAO,SAAS,CAAC,CAAA;AAC9D,IAAA,IAAA,CAAK,MAAM,WAAA,CAAY,IAAA,CAAK,UAAU,IAAA,CAAK,MAAA,CAAO,MAAM,CAAC,CAAA;AACzD,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,WAAA,EAAa,CAAA;AAAA,EAC7C;AAAA,EAEQ,YAAY,KAAA,EAA+B;AAC/C,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,IAAA,MAAA,CAAO,MAAA,CAAO,OAAO,KAAA,EAAO;AAAA,MACxB,OAAA,EAAgB,MAAA;AAAA,MAChB,UAAA,EAAgB,QAAA;AAAA,MAChB,cAAA,EAAgB,eAAA;AAAA,MAChB,OAAA,EAAgB,WAAA;AAAA,MAChB,YAAA,EAAgB,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAAA,KACrD,CAAA;AAED,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC7C,IAAA,OAAA,CAAQ,cAAc,CAAA,EAAG,KAAK,IAAI,IAAA,CAAK,MAAA,CAAO,UAAU,WAAW,CAAA,CAAA;AACnE,IAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,KAAA,EAAO;AAAA,MACzB,KAAA,EAAY,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAA;AAAA,MAC/B,UAAA,EAAY,KAAA;AAAA,MACZ,QAAA,EAAY;AAAA,KACf,CAAA;AAED,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC9C,IAAA,QAAA,CAAS,SAAA,GAAY,UAAA;AACrB,IAAA,MAAA,CAAO,MAAA,CAAO,SAAS,KAAA,EAAO;AAAA,MAC1B,OAAA,EAAY,aAAA;AAAA,MACZ,UAAA,EAAY,QAAA;AAAA,MACZ,KAAA,EAAY,KAAK,KAAA,CAAM,QAAA;AAAA,MACvB,MAAA,EAAY;AAAA,KACf,CAAA;AACD,IAAA,QAAA,CAAS,gBAAA,CAAiB,cAAc,MAAM;AAAE,MAAA,QAAA,CAAS,KAAA,CAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAA;AAAA,IAAM,CAAC,CAAA;AACjG,IAAA,QAAA,CAAS,gBAAA,CAAiB,cAAc,MAAM;AAAE,MAAA,QAAA,CAAS,KAAA,CAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,QAAA;AAAA,IAAU,CAAC,CAAA;AAC7F,IAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,MAAM,IAAA,CAAK,MAAM,CAAA;AAEpD,IAAA,MAAA,CAAO,MAAA,CAAO,SAAS,QAAQ,CAAA;AAC/B,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEQ,UAAU,MAAA,EAAyC;AACvD,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,MAAA,CAAO,MAAA,CAAO,KAAK,KAAA,EAAO;AAAA,MACtB,OAAA,EAAS,WAAA;AAAA,MACT,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe,QAAA;AAAA,MACf,GAAA,EAAK;AAAA,KACR,CAAA;AAED,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACrB,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC3C,MAAA,KAAA,CAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,QAAA;AAC1C,MAAA,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,KAAA,EAAO,EAAE,KAAA,EAAO,KAAK,KAAA,CAAM,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,CAAA;AAC3E,MAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AACtB,MAAA,OAAO,IAAA;AAAA,IACX;AAEA,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AACxB,MAAA,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,IAC3C;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEQ,WAAW,KAAA,EAAsC;AACrD,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,MACrB,OAAA,EAAgB,MAAA;AAAA,MAChB,UAAA,EAAgB,QAAA;AAAA,MAChB,cAAA,EAAgB,eAAA;AAAA,MAChB,GAAA,EAAgB;AAAA,KACnB,CAAA;AAED,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,IAAA,KAAA,CAAM,cAAc,KAAA,CAAM,KAAA;AAC1B,IAAA,MAAA,CAAO,MAAA,CAAO,MAAM,KAAA,EAAO;AAAA,MACvB,KAAA,EAAU,KAAK,KAAA,CAAM,QAAA;AAAA,MACrB,QAAA,EAAU,MAAA;AAAA,MACV,IAAA,EAAU;AAAA,KACb,CAAA;AAED,IAAA,MAAM,aAAa,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,GAAG,KAAK,KAAA,CAAM,OAAA;AAE1D,IAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AACzB,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,MAAA,KAAA,CAAM,IAAA,GAAQ,QAAA;AACd,MAAA,KAAA,CAAM,GAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAC9B,MAAA,KAAA,CAAM,GAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAC9B,MAAA,KAAA,CAAM,IAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,MAAA,KAAA,CAAM,KAAA,GAAQ,OAAO,UAAU,CAAA;AAC/B,MAAA,MAAA,CAAO,MAAA,CAAO,MAAM,KAAA,EAAO;AAAA,QACvB,KAAA,EAAc,MAAA;AAAA,QACd,UAAA,EAAc,KAAK,KAAA,CAAM,UAAA;AAAA,QACzB,KAAA,EAAc,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAA;AAAA,QACjC,MAAA,EAAc,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,QAChD,YAAA,EAAc,KAAA;AAAA,QACd,OAAA,EAAc,SAAA;AAAA;AAAA;AAAA,QAGd,QAAA,EAAc,MAAA;AAAA,QACd,UAAA,EAAc,gCAAA;AAAA,QACd,OAAA,EAAc,MAAA;AAAA,QACd,SAAA,EAAc;AAAA,OACjB,CAAA;AACD,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,GAAA,EAAK,KAAK,CAAA;AACnC,MAAA,GAAA,CAAI,MAAA,CAAO,OAAO,KAAK,CAAA;AAAA,IAC3B,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU;AAChC,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,MAAA,KAAA,MAAW,GAAA,IAAO,MAAM,OAAA,EAAS;AAC7B,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,QAAA,MAAA,CAAO,KAAA,GAAQ,GAAA;AACf,QAAA,MAAA,CAAO,WAAA,GAAc,GAAA;AACrB,QAAA,IAAI,GAAA,KAAQ,MAAA,CAAO,UAAU,CAAA,SAAU,QAAA,GAAW,IAAA;AAClD,QAAA,MAAA,CAAO,YAAY,MAAM,CAAA;AAAA,MAC7B;AACA,MAAA,MAAA,CAAO,MAAA,CAAO,OAAO,KAAA,EAAO;AAAA,QACxB,QAAA,EAAc,OAAA;AAAA,QACd,UAAA,EAAc,KAAK,KAAA,CAAM,UAAA;AAAA,QACzB,KAAA,EAAc,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAA;AAAA,QACjC,MAAA,EAAc,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,QAChD,YAAA,EAAc,KAAA;AAAA,QACd,OAAA,EAAc,SAAA;AAAA,QACd,QAAA,EAAc,MAAA;AAAA,QACd,UAAA,EAAc,gCAAA;AAAA,QACd,OAAA,EAAc,MAAA;AAAA,QACd,MAAA,EAAc;AAAA,OACjB,CAAA;AACD,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,GAAA,EAAK,MAAM,CAAA;AACpC,MAAA,GAAA,CAAI,MAAA,CAAO,OAAO,MAAM,CAAA;AAAA,IAC5B,CAAA,MAAO;AACH,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,MAAA,KAAA,CAAM,IAAA,GAAQ,OAAA;AACd,MAAA,KAAA,CAAM,KAAA,GAAQ,OAAO,UAAU,CAAA;AAC/B,MAAA,MAAA,CAAO,MAAA,CAAO,MAAM,KAAA,EAAO;AAAA,QACvB,KAAA,EAAc,MAAA;AAAA,QACd,MAAA,EAAc,MAAA;AAAA,QACd,MAAA,EAAc,MAAA;AAAA,QACd,OAAA,EAAc,GAAA;AAAA,QACd,MAAA,EAAc,SAAA;AAAA,QACd,UAAA,EAAc,aAAA;AAAA,QACd,YAAA,EAAc;AAAA,OACjB,CAAA;AACD,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,GAAA,EAAK,KAAK,CAAA;AACnC,MAAA,GAAA,CAAI,MAAA,CAAO,OAAO,KAAK,CAAA;AAAA,IAC3B;AAEA,IAAA,OAAO,GAAA;AAAA,EACX;AAAA,EAEQ,WAAA,GAA8B;AAClC,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,IAAA,MAAA,CAAO,MAAA,CAAO,OAAO,KAAA,EAAO;AAAA,MACxB,OAAA,EAAa,MAAA;AAAA,MACb,GAAA,EAAa,KAAA;AAAA,MACb,OAAA,EAAa,WAAA;AAAA,MACb,SAAA,EAAa,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAAA,KAClD,CAAA;AAED,IAAA,MAAM,YAAY,IAAA,CAAK,UAAA,CAAW,QAAA,EAAU,SAAA,EAAW,eAAe,SAAS,CAAA;AAC/E,IAAA,SAAA,CAAU,gBAAA,CAAiB,SAAS,MAAM;AACtC,MAAA,IAAA,CAAK,QAAA,IAAW;AAChB,MAAA,IAAA,CAAK,IAAA,EAAK;AAAA,IACd,CAAC,CAAA;AAED,IAAA,MAAM,YAAY,IAAA,CAAK,UAAA,CAAW,QAAA,EAAU,MAAA,EAAQ,WAAW,SAAS,CAAA;AACxE,IAAA,SAAA,CAAU,gBAAA,CAAiB,SAAS,MAAM;AACtC,MAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,KAAK,QAAA,EAAU;AACpC,MAAA,MAAM,SAA0B,EAAC;AACjC,MAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ;AACpC,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAM,GAAG,CAAA;AACxC,QAAA,IAAI,CAAC,GAAA,EAAK;AACV,QAAA,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA,CAAM,IAAA,KAAS,QAAA,GAAW,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,GAAI,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAAA,MACtF;AACA,MAAA,IAAA,CAAK,SAAS,MAAM,CAAA;AACpB,MAAA,IAAA,CAAK,IAAA,EAAK;AAAA,IACd,CAAC,CAAA;AAED,IAAA,MAAA,CAAO,MAAA,CAAO,WAAW,SAAS,CAAA;AAClC,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEQ,UAAA,CACJ,IAAA,EACA,KAAA,EACA,UAAA,EACA,WAAA,EACiB;AACjB,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,IAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAClB,IAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,MACrB,IAAA,EAAc,GAAA;AAAA,MACd,KAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA,EAAc,aAAa,WAAW,CAAA,CAAA;AAAA,MACtC,YAAA,EAAc,KAAA;AAAA,MACd,OAAA,EAAc,OAAA;AAAA,MACd,MAAA,EAAc,SAAA;AAAA,MACd,QAAA,EAAc,MAAA;AAAA,MACd,UAAA,EAAY,gCAAA;AAAA,MACZ,UAAA,EAAc,KAAA;AAAA,MACd,OAAA,EAAc;AAAA,KACjB,CAAA;AACD,IAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AAAE,MAAA,GAAA,CAAI,MAAM,OAAA,GAAU,MAAA;AAAA,IAAQ,CAAC,CAAA;AACxE,IAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AAAE,MAAA,GAAA,CAAI,MAAM,OAAA,GAAU,GAAA;AAAA,IAAK,CAAC,CAAA;AACrE,IAAA,OAAO,GAAA;AAAA,EACX;AACJ,CAAA;;;ACjTA,IAAM,UAAA,GAA0C;AAAA,EAC5C,UAAA,EAAY,YAAA;AAAA,EACZ,OAAA,EAAS;AACb,CAAA;AAEO,IAAM,sBAAN,MAA0B;AAAA,EAkB7B,WAAA,CACI,KAAA,EACA,OAAA,EACA,MAAA,GAAuB,cAAA,CAAe,SACtC,cAAA,GAAiB,IAAA,EACjB,iBAAA,GAAoB,KAAA,EACpB,kBAAA,EACF;AAhBF,IAAA,IAAA,CAAQ,SAAA,GAAyB,YAAA;AACjC,IAAA,IAAA,CAAQ,QAAA,GAAgD,IAAA;AACxD,IAAA,IAAA,CAAQ,OAAA,GAA+B,IAAA;AAEvC,IAAA,IAAA,CAAQ,MAAA,uBAAa,GAAA,EAAoC;AAarD,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,OAAA,GAAU,EAAE,GAAG,OAAA,EAAQ;AAC5B,IAAA,IAAA,CAAK,cAAA,GAAiB,cAAA;AACtB,IAAA,IAAA,CAAK,iBAAA,GAAoB,iBAAA;AACzB,IAAA,IAAA,CAAK,kBAAA,GAAqB,kBAAA;AAC1B,IAAA,IAAI,CAAC,cAAA,IAAkB,IAAA,CAAK,SAAA,KAAc,SAAA,OAAgB,SAAA,GAAY,YAAA;AAGtE,IAAA,IAAA,CAAK,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACtC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO;AAAA,MACzB,QAAA,EAAU,OAAA;AAAA,MACV,KAAA,EAAO,GAAA;AAAA,MACP,UAAA,EAAY,iBAAA;AAAA,MACZ,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,cAAA,EAAgB,QAAA;AAAA,MAChB,MAAA,EAAQ;AAAA,KACX,CAAA;AACD,IAAA,IAAA,CAAK,EAAA,CAAG,gBAAA,CAAiB,WAAA,EAAa,CAAC,CAAA,KAAM;AACzC,MAAA,IAAI,CAAA,CAAE,MAAA,KAAW,IAAA,CAAK,EAAA,OAAS,IAAA,EAAK;AAAA,IACxC,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO;AAAA,MAC5B,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe,QAAA;AAAA,MACf,KAAA,EAAO,OAAA;AAAA,MACP,SAAA,EAAW,OAAA;AAAA,MACX,QAAA,EAAU,oBAAA;AAAA,MACV,SAAA,EAAW,oBAAA;AAAA,MACX,UAAA,EAAY,MAAM,OAAA,CAAQ,UAAA;AAAA,MAC1B,MAAA,EAAQ,CAAA,UAAA,EAAa,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MACrC,YAAA,EAAc,MAAA;AAAA,MACd,SAAA,EAAW,0DAAA;AAAA,MACX,UAAA,EAAY,+CAAA;AAAA,MACZ,QAAA,EAAU,MAAA;AAAA,MACV,QAAA,EAAU;AAAA,KACb,CAAA;AACD,IAAA,IAAA,CAAK,MAAM,gBAAA,CAAiB,WAAA,EAAa,CAAC,CAAA,KAAM,CAAA,CAAE,iBAAiB,CAAA;AAGnE,IAAA,MAAM,MAAA,GAAS,KAAK,WAAA,EAAY;AAChC,IAAA,IAAA,CAAK,KAAA,CAAM,YAAY,MAAM,CAAA;AAG7B,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,MAAA,CAAO,MAAA,CAAO,KAAK,KAAA,EAAO;AAAA,MACtB,OAAA,EAAS,MAAA;AAAA,MACT,IAAA,EAAM,GAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACb,CAAA;AAED,IAAA,IAAA,CAAK,OAAA,GAAU,KAAK,YAAA,EAAa;AACjC,IAAA,IAAA,CAAK,WAAA,CAAY,KAAK,OAAO,CAAA;AAE7B,IAAA,IAAA,CAAK,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO;AAAA,MAC9B,IAAA,EAAM,GAAA;AAAA,MACN,OAAA,EAAS,WAAA;AAAA,MACT,SAAA,EAAW,MAAA;AAAA,MACX,cAAA,EAAgB;AAAA,KACnB,CAAA;AACD,IAAA,IAAA,CAAK,WAAA,CAAY,KAAK,OAAO,CAAA;AAE7B,IAAA,IAAA,CAAK,KAAA,CAAM,YAAY,IAAI,CAAA;AAG3B,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,WAAA,EAAa,CAAA;AAEzC,IAAA,IAAA,CAAK,EAAA,CAAG,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA;AAAA,EAClC;AAAA,EAEA,IAAA,CAAK,OAAA,EAAwB,QAAA,EAAsC,OAAA,EAA4B;AAC3F,IAAA,MAAM,aAAa,IAAA,CAAK,SAAA;AACxB,IAAA,IAAA,CAAK,OAAA,GAAU,EAAE,GAAG,OAAA,EAAQ;AAC5B,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,UAAU,OAAA,IAAW,IAAA;AAC1B,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,EAAA,CAAG,MAAM,OAAA,GAAU,MAAA;AACxB,IAAA,IAAI,CAAC,UAAA,EAAY,IAAA,CAAK,kBAAA,IAAqB;AAAA,EAC/C;AAAA,EAEA,IAAA,GAAa;AACT,IAAA,MAAM,aAAa,IAAA,CAAK,SAAA;AACxB,IAAA,IAAA,CAAK,EAAA,CAAG,MAAM,OAAA,GAAU,MAAA;AACxB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,IAAI,UAAA,OAAiB,kBAAA,IAAqB;AAAA,EAC9C;AAAA,EAEA,IAAI,SAAA,GAAqB;AACrB,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,OAAA,KAAY,MAAA;AAAA,EACrC;AAAA,EAEA,SAAS,KAAA,EAAyB;AAC9B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,IAAI,KAAK,EAAA,CAAG,KAAA,CAAM,OAAA,KAAY,MAAA,OAAa,aAAA,EAAc;AAAA,EAC7D;AAAA,EAEA,OAAA,GAAgB;AACZ,IAAA,IAAA,CAAK,GAAG,MAAA,EAAO;AAAA,EACnB;AAAA;AAAA,EAIQ,IAAA,GAAa;AACjB,IAAA,IAAA,CAAK,QAAA,GAAW,EAAE,GAAG,IAAA,CAAK,SAAS,CAAA;AAAA,EACvC;AAAA;AAAA,EAIQ,eAAA,GAAwB;AAC5B,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO;AAAA,MAC5B,UAAA,EAAY,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,UAAA;AAAA,MAC/B,MAAA,EAAQ,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAAA,KAC7C,CAAA;AAED,IAAA,IAAA,CAAK,QAAQ,SAAA,GAAY,EAAA;AACzB,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAClB,IAAA,IAAA,CAAK,gBAAA,CAAiB,KAAK,OAAO,CAAA;AAClC,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,EAC5B;AAAA;AAAA,EAIQ,WAAA,GAA8B;AAClC,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,IAAA,MAAA,CAAO,MAAA,CAAO,OAAO,KAAA,EAAO;AAAA,MACxB,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,cAAA,EAAgB,eAAA;AAAA,MAChB,OAAA,EAAS,gBAAA;AAAA,MACT,YAAA,EAAc,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MAChD,UAAA,EAAY;AAAA,KACf,CAAA;AAED,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC3C,IAAA,KAAA,CAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,KAAA;AACzC,IAAA,MAAA,CAAO,MAAA,CAAO,MAAM,KAAA,EAAO;AAAA,MACvB,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAA;AAAA,MAC1B,UAAA,EAAY,KAAA;AAAA,MACZ,QAAA,EAAU,MAAA;AAAA,MACV,aAAA,EAAe;AAAA,KAClB,CAAA;AAED,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAChD,IAAA,QAAA,CAAS,SAAA,GAAY,aAAA;AACrB,IAAA,MAAA,CAAO,MAAA,CAAO,SAAS,KAAA,EAAO;AAAA,MAC1B,KAAA,EAAO,KAAK,KAAA,CAAM,QAAA;AAAA,MAClB,MAAA,EAAQ,SAAA;AAAA,MACR,UAAA,EAAY,aAAA;AAAA,MACZ,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,KAAA;AAAA,MACT,YAAA,EAAc,KAAA;AAAA,MACd,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,cAAA,EAAgB,QAAA;AAAA,MAChB,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY;AAAA,KACf,CAAA;AACD,IAAA,QAAA,CAAS,gBAAA,CAAiB,cAAc,MAAM;AAC1C,MAAA,QAAA,CAAS,KAAA,CAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAA;AAC1C,MAAA,QAAA,CAAS,KAAA,CAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,QAAA;AAAA,IAC9C,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,gBAAA,CAAiB,cAAc,MAAM;AAC1C,MAAA,QAAA,CAAS,KAAA,CAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,QAAA;AAClC,MAAA,QAAA,CAAS,MAAM,UAAA,GAAa,aAAA;AAAA,IAChC,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,MAAM,IAAA,CAAK,MAAM,CAAA;AAEpD,IAAA,MAAA,CAAO,MAAA,CAAO,OAAO,QAAQ,CAAA;AAC7B,IAAA,OAAO,MAAA;AAAA,EACX;AAAA;AAAA,EAIQ,WAAA,GAA8B;AAClC,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,IAAA,MAAA,CAAO,MAAA,CAAO,OAAO,KAAA,EAAO;AAAA,MACxB,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,cAAA,EAAgB,UAAA;AAAA,MAChB,OAAA,EAAS,WAAA;AAAA,MACT,SAAA,EAAW,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MAC7C,UAAA,EAAY;AAAA,KACf,CAAA;AAED,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAChD,IAAA,QAAA,CAAS,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,QAAA;AAC5C,IAAA,MAAA,CAAO,MAAA,CAAO,SAAS,KAAA,EAAO;AAAA,MAC1B,KAAA,EAAO,KAAK,KAAA,CAAM,QAAA;AAAA,MAClB,QAAA,EAAU,MAAA;AAAA,MACV,UAAA,EAAY,gCAAA;AAAA,MACZ,UAAA,EAAY,aAAA;AAAA,MACZ,MAAA,EAAQ,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MAC1C,YAAA,EAAc,KAAA;AAAA,MACd,OAAA,EAAS,UAAA;AAAA,MACT,MAAA,EAAQ,SAAA;AAAA,MACR,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY;AAAA,KACf,CAAA;AACD,IAAA,QAAA,CAAS,gBAAA,CAAiB,cAAc,MAAM;AAC1C,MAAA,QAAA,CAAS,KAAA,CAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAA;AAC1C,MAAA,QAAA,CAAS,KAAA,CAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,MAAA;AAC3C,MAAA,QAAA,CAAS,KAAA,CAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,QAAA;AAAA,IAC9C,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,gBAAA,CAAiB,cAAc,MAAM;AAC1C,MAAA,QAAA,CAAS,KAAA,CAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,QAAA;AAClC,MAAA,QAAA,CAAS,KAAA,CAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,UAAA;AACxC,MAAA,QAAA,CAAS,MAAM,UAAA,GAAa,aAAA;AAAA,IAChC,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAS,MAAM;AACrC,MAAA,IAAA,CAAK,OAAA,IAAU;AACf,MAAA,IAAA,CAAK,IAAA,EAAK;AAAA,IACd,CAAC,CAAA;AAED,IAAA,MAAA,CAAO,YAAY,QAAQ,CAAA;AAC3B,IAAA,OAAO,MAAA;AAAA,EACX;AAAA;AAAA,EAIQ,YAAA,GAA+B;AACnC,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,IAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,KAAA,EAAO;AAAA,MACzB,KAAA,EAAO,OAAA;AAAA,MACP,UAAA,EAAY,GAAA;AAAA,MACZ,WAAA,EAAa,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MAC/C,OAAA,EAAS,QAAA;AAAA,MACT,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe,QAAA;AAAA,MACf,GAAA,EAAK;AAAA,KACR,CAAA;AACD,IAAA,IAAA,CAAK,iBAAiB,OAAO,CAAA;AAC7B,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEQ,iBAAiB,SAAA,EAAiC;AACtD,IAAA,MAAM,IAAA,GAAsB,KAAK,cAAA,GAAiB,CAAC,cAAc,SAAS,CAAA,GAAI,CAAC,YAAY,CAAA;AAC3F,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACpB,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,MAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,QACrB,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,GAAA,EAAK,KAAA;AAAA,QACL,OAAA,EAAS,UAAA;AAAA,QACT,UAAA,EAAY,aAAA;AAAA,QACZ,MAAA,EAAQ,MAAA;AAAA,QACR,UAAA,EAAY,uBAAA;AAAA,QACZ,KAAA,EAAO,KAAK,KAAA,CAAM,QAAA;AAAA,QAClB,QAAA,EAAU,MAAA;AAAA,QACV,UAAA,EAAY,gCAAA;AAAA,QACZ,MAAA,EAAQ,SAAA;AAAA,QACR,KAAA,EAAO,MAAA;AAAA,QACP,SAAA,EAAW,MAAA;AAAA,QACX,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,6BAAA;AAAA,QACZ,SAAA,EAAW;AAAA,OACd,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC9C,MAAA,QAAA,CAAS,SAAA,GAAY,SAAS,GAAG,CAAA;AACjC,MAAA,MAAA,CAAO,MAAA,CAAO,SAAS,KAAA,EAAO,EAAE,SAAS,MAAA,EAAQ,UAAA,EAAY,KAAK,CAAA;AAElE,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC/C,MAAA,SAAA,CAAU,WAAA,GAAc,WAAW,GAAG,CAAA;AAEtC,MAAA,GAAA,CAAI,MAAA,CAAO,UAAU,SAAS,CAAA;AAE9B,MAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACrC,QAAA,IAAI,IAAA,CAAK,cAAc,GAAA,EAAK;AACxB,UAAA,GAAA,CAAI,KAAA,CAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,QAAA;AACrC,UAAA,GAAA,CAAI,KAAA,CAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAA;AAAA,QACzC;AAAA,MACJ,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACrC,QAAA,IAAI,IAAA,CAAK,cAAc,GAAA,EAAK;AACxB,UAAA,GAAA,CAAI,MAAM,UAAA,GAAa,aAAA;AACvB,UAAA,GAAA,CAAI,KAAA,CAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,QAAA;AAAA,QACjC;AAAA,MACJ,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,gBAAA,CAAiB,SAAS,MAAM;AAChC,QAAA,IAAA,CAAK,SAAA,GAAY,GAAA;AACjB,QAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,QAAA,IAAA,CAAK,aAAA,EAAc;AAAA,MACvB,CAAC,CAAA;AAED,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,GAAG,CAAA;AACxB,MAAA,SAAA,CAAU,YAAY,GAAG,CAAA;AAAA,IAC7B;AAAA,EACJ;AAAA,EAEQ,kBAAA,GAA2B;AAC/B,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,CAAA,IAAK,KAAK,MAAA,EAAQ;AAClC,MAAA,MAAM,QAAA,GAAW,QAAQ,IAAA,CAAK,SAAA;AAC9B,MAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,QACrB,UAAA,EAAY,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAG,QAAA,GAAW,aAAA;AAAA,QAChD,OAAO,QAAA,GAAW,IAAA,CAAK,MAAM,EAAA,CAAG,UAAA,GAAa,KAAK,KAAA,CAAM,QAAA;AAAA,QACxD,YAAY,QAAA,GACN,CAAA,UAAA,EAAa,KAAK,KAAA,CAAM,EAAA,CAAG,MAAM,CAAA,CAAA,GACjC,uBAAA;AAAA,QACN,UAAA,EAAY,WAAW,KAAA,GAAQ;AAAA,OAClC,CAAA;AAAA,IACL;AAAA,EACJ;AAAA;AAAA,EAIQ,aAAA,GAAsB;AAC1B,IAAA,IAAA,CAAK,QAAQ,SAAA,GAAY,EAAA;AACzB,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAExB,IAAA,QAAQ,KAAK,SAAA;AAAW,MACpB,KAAK,YAAA;AACD,QAAA,IAAA,CAAK,sBAAA,EAAuB;AAC5B,QAAA;AAAA,MACJ,KAAK,SAAA;AACD,QAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,QAAA;AAAA;AACR,EACJ;AAAA;AAAA,EAIQ,sBAAA,GAA+B;AAEnC,IAAA,IAAI,KAAK,iBAAA,EAAmB;AACxB,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC7C,MAAA,MAAA,CAAO,MAAA,CAAO,SAAS,KAAA,EAAO;AAAA,QAC1B,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB,eAAA;AAAA,QAChB,aAAA,EAAe,MAAA;AAAA,QACf,YAAA,EAAc,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAAA,OACnD,CAAA;AAED,MAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAChD,MAAA,UAAA,CAAW,WAAA,GAAc,OAAA;AACzB,MAAA,MAAA,CAAO,MAAA,CAAO,WAAW,KAAA,EAAO;AAAA,QAC5B,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAA;AAAA,QAC1B,QAAA,EAAU,MAAA;AAAA,QACV,UAAA,EAAY;AAAA,OACf,CAAA;AAED,MAAA,QAAA,CAAS,MAAA,CAAO,UAAA,EAAY,IAAA,CAAK,eAAA,EAAiB,CAAA;AAClD,MAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,QAAQ,CAAA;AAAA,IACrC;AAGA,IAAA,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,IAAA,CAAK,iBAAA,CAAkB,QAAQ,CAAC,CAAA;AACzD,IAAA,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,IAAA,CAAK,cAAA,EAAgB,CAAA;AAG9C,IAAA,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,IAAA,CAAK,iBAAA,CAAkB,gBAAgB,CAAC,CAAA;AACjE,IAAA,IAAA,CAAK,OAAA,CAAQ,WAAA;AAAA,MACT,IAAA,CAAK,wBAAA;AAAA,QACD,sBAAA;AAAA,QACA,0DAAA;AAAA,QACA,KAAK,iBAAA,CAAkB,IAAA,CAAK,OAAA,CAAQ,sBAAA,EAAwB,CAAC,CAAA,KAAM;AAC/D,UAAA,IAAA,CAAK,QAAQ,sBAAA,GAAyB,CAAA;AACtC,UAAA,IAAA,CAAK,IAAA,EAAK;AAAA,QACd,CAAC;AAAA;AACL,KACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAA,CACJ,OAAA,EACA,QAAA,EACA,UAAA,EACc;AACd,IAAA,IAAI,KAAA,GAAQ,OAAA;AAEZ,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,MAAA,CAAO,MAAA,CAAO,KAAK,KAAA,EAAO;AAAA,MACtB,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,GAAA,EAAK;AAAA,KACR,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA,GAAI,IAAA;AAC7D,IAAA,MAAM,KAAA,GAAQ,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA,GAAI,IAAA;AAC5D,IAAA,IAAI,MAAA,IAAU,SAAS,UAAA,EAAY;AAC/B,MAAA,MAAA,CAAO,cAAc,UAAA,CAAW,GAAA;AAChC,MAAA,KAAA,CAAM,cAAc,UAAA,CAAW,EAAA;AAAA,IACnC;AAEA,IAAA,MAAM,eAAe,MAAM;AACvB,MAAA,IAAI,CAAC,MAAA,IAAU,CAAC,KAAA,EAAO;AACvB,MAAA,MAAA,CAAO,MAAA,CAAO,OAAO,KAAA,EAAO;AAAA,QACxB,OAAO,KAAA,GAAQ,IAAA,CAAK,MAAM,QAAA,GAAW,IAAA,CAAK,MAAM,OAAA,CAAQ,IAAA;AAAA,QACxD,UAAA,EAAY,QAAQ,KAAA,GAAQ,KAAA;AAAA,QAC5B,QAAA,EAAU,MAAA;AAAA,QACV,MAAA,EAAQ,SAAA;AAAA,QACR,UAAA,EAAY;AAAA,OACf,CAAA;AACD,MAAA,MAAA,CAAO,MAAA,CAAO,MAAM,KAAA,EAAO;AAAA,QACvB,OAAO,KAAA,GAAQ,IAAA,CAAK,MAAM,OAAA,CAAQ,IAAA,GAAO,KAAK,KAAA,CAAM,QAAA;AAAA,QACpD,UAAA,EAAY,QAAQ,KAAA,GAAQ,KAAA;AAAA,QAC5B,QAAA,EAAU,MAAA;AAAA,QACV,MAAA,EAAQ,SAAA;AAAA,QACR,UAAA,EAAY;AAAA,OACf,CAAA;AAAA,IACL,CAAA;AAEA,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC1C,IAAA,MAAA,CAAO,MAAA,CAAO,MAAM,KAAA,EAAO;AAAA,MACvB,QAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO,MAAA;AAAA,MACP,MAAA,EAAQ,MAAA;AAAA,MACR,YAAA,EAAc,MAAA;AAAA,MACd,MAAA,EAAQ,SAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,UAAA,EAAY,kBAAA;AAAA,MACZ,UAAA,EAAY,KAAK,KAAA,CAAM,UAAA;AAAA,MACvB,MAAA,EAAQ,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,EAAA,CAAA;AAAA,MACxC,SAAA,EAAW;AAAA,KACd,CAAA;AAED,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC1C,IAAA,MAAA,CAAO,MAAA,CAAO,MAAM,KAAA,EAAO;AAAA,MACvB,QAAA,EAAU,UAAA;AAAA,MACV,GAAA,EAAK,KAAA;AAAA,MACL,IAAA,EAAM,QAAQ,MAAA,GAAS,KAAA;AAAA,MACvB,KAAA,EAAO,MAAA;AAAA,MACP,MAAA,EAAQ,MAAA;AAAA,MACR,YAAA,EAAc,KAAA;AAAA,MACd,UAAA,EAAY,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,MAAA;AAAA,MAC1B,UAAA,EAAY,YAAA;AAAA,MACZ,aAAA,EAAe;AAAA,KAClB,CAAA;AACD,IAAA,KAAA,CAAM,YAAY,KAAK,CAAA;AAEvB,IAAA,MAAM,WAAW,MAAM;AACnB,MAAA,KAAA,GAAQ,CAAC,KAAA;AACT,MAAA,KAAA,CAAM,KAAA,CAAM,IAAA,GAAO,KAAA,GAAQ,MAAA,GAAS,KAAA;AACpC,MAAA,YAAA,EAAa;AACb,MAAA,QAAA,CAAS,KAAK,CAAA;AAAA,IAClB,CAAA;AAEA,IAAA,KAAA,CAAM,gBAAA,CAAiB,SAAS,QAAQ,CAAA;AACxC,IAAA,IAAI,UAAU,KAAA,EAAO;AACjB,MAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,MAAM;AACnC,QAAA,IAAI,OAAO,QAAA,EAAS;AAAA,MACxB,CAAC,CAAA;AACD,MAAA,KAAA,CAAM,gBAAA,CAAiB,SAAS,MAAM;AAClC,QAAA,IAAI,CAAC,OAAO,QAAA,EAAS;AAAA,MACzB,CAAC,CAAA;AAAA,IACL;AAEA,IAAA,YAAA,EAAa;AACb,IAAA,IAAI,UAAU,KAAA,EAAO;AACjB,MAAA,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,KAAA,EAAO,KAAK,CAAA;AAAA,IACpC,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,IACrB;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEQ,eAAA,GAAkC;AACtC,IAAA,OAAO,IAAA,CAAK,iBAAA;AAAA,MACR,IAAA,CAAK,QAAQ,KAAA,KAAU,OAAA;AAAA,MACvB,CAAC,OAAA,KAAY;AACT,QAAA,IAAA,CAAK,OAAA,CAAQ,KAAA,GAAQ,OAAA,GAAU,OAAA,GAAU,MAAA;AACzC,QAAA,IAAA,CAAK,IAAA,EAAK;AACV,QAAA,IAAA,CAAK,aAAA,EAAc;AAAA,MACvB,CAAA;AAAA,MACA,EAAE,GAAA,EAAK,MAAA,EAAQ,EAAA,EAAI,OAAA;AAAQ,KAC/B;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWQ,cAAA,GAAiC;AACrC,IAAA,MAAM,QAAA,GAAW,KAAK,OAAA,CAAQ,KAAA;AAC9B,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA,CAAQ,YAAA,GAAe,QAAQ,KAAK,EAAC;AAE1D,IAAA,MAAM,MAAA,GAAS,EAAA;AACf,IAAA,MAAM,GAAA,GAAM,CAAA;AAEZ,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,MAAA,CAAO,MAAA,CAAO,KAAK,KAAA,EAAO;AAAA,MACtB,OAAA,EAAS,MAAA;AAAA,MACT,mBAAA,EAAqB,CAAA,YAAA,EAAe,MAAM,CAAA,GAAA,EAAM,MAAM,CAAA,EAAA,CAAA;AAAA,MACtD,SAAA,EAAW,GAAG,GAAG,CAAA,EAAA,CAAA;AAAA,MACjB,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS,WAAA;AAAA,MACT,UAAA,EAAY;AAAA,KACf,CAAA;AAKD,IAAA,MAAM,IAAA,GAAiB;AAAA,MACnB,EAAE,KAAA,EAAO,YAAA,EAAc,EAAA,EAAI,EAAE,KAAA,EAAO,YAAA,EAAc,QAAA,EAAU,IAAA,CAAK,KAAA,CAAM,UAAA,EAAW,EAAE;AAAA,MACpF,EAAE,KAAA,EAAO,MAAA,EAAQ,EAAA,EAAI,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,IAAA,CAAK,KAAA,CAAM,IAAA,EAAK,EAAE;AAAA,MAClE,EAAE,KAAA,EAAO,WAAA,EAAa,EAAA,EAAI,EAAE,KAAA,EAAO,UAAA,EAAY,QAAA,EAAU,IAAA,CAAK,KAAA,CAAM,QAAA,EAAS,EAAE;AAAA,MAC/E,EAAE,KAAA,EAAO,aAAA,EAAe,EAAA,EAAI,EAAE,KAAA,EAAO,YAAA,EAAc,QAAA,EAAU,IAAA,CAAK,KAAA,CAAM,UAAA,EAAW,EAAE;AAAA,MACrF,EAAE,KAAA,EAAO,WAAA,EAAa,EAAA,EAAI,EAAE,KAAA,EAAO,WAAA,EAAa,QAAA,EAAU,IAAA,CAAK,KAAA,CAAM,SAAA,EAAU,EAAE;AAAA,MACjF;AAAA,QACI,KAAA,EAAO,aAAA;AAAA,QACP,EAAA,EAAI,EAAE,KAAA,EAAO,UAAA,EAAY,UAAU,IAAA,CAAK,KAAA,CAAM,OAAO,EAAA,EAAG;AAAA,QACxD,EAAA,EAAI,EAAE,KAAA,EAAO,YAAA,EAAc,UAAU,IAAA,CAAK,KAAA,CAAM,OAAO,IAAA;AAAK,OAChE;AAAA,MACA;AAAA,QACI,KAAA,EAAO,aAAA;AAAA,QACP,EAAA,EAAI,EAAE,KAAA,EAAO,QAAA,EAAU,UAAU,IAAA,CAAK,KAAA,CAAM,OAAO,MAAA,EAAO;AAAA,QAC1D,EAAA,EAAI,EAAE,KAAA,EAAO,UAAA,EAAY,UAAU,IAAA,CAAK,KAAA,CAAM,OAAO,QAAA;AAAS,OAClE;AAAA,MACA;AAAA,QACI,KAAA,EAAO,eAAA;AAAA,QACP,EAAA,EAAI;AAAA,UACA,KAAA,EAAO,UAAA;AAAA,UACP,UAAU,IAAA,CAAK,KAAA,CAAM,OAAO,QAAA,IAAY,IAAA,CAAK,MAAM,MAAA,CAAO;AAAA,SAC9D;AAAA,QACA,EAAA,EAAI;AAAA,UACA,KAAA,EAAO,YAAA;AAAA,UACP,UAAU,IAAA,CAAK,KAAA,CAAM,OAAO,UAAA,IAAc,IAAA,CAAK,MAAM,MAAA,CAAO;AAAA;AAChE,OACJ;AAAA,MACA;AAAA,QACI,KAAA,EAAO,QAAA;AAAA,QACP,EAAA,EAAI,EAAE,KAAA,EAAO,UAAA,EAAY,UAAU,IAAA,CAAK,KAAA,CAAM,OAAO,EAAA,EAAG;AAAA,QACxD,EAAA,EAAI,EAAE,KAAA,EAAO,YAAA,EAAc,UAAU,IAAA,CAAK,KAAA,CAAM,OAAO,IAAA;AAAK;AAChE,KACJ;AAEA,IAAA,MAAM,UAAA,GAAa,CAAC,GAAA,KAChB,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,IAAK,GAAA,CAAI,QAAA,EAAU,CAAC,GAAA,KAAQ;AAC9D,MAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,cAAc,IAAA,CAAK,OAAA,CAAQ,eAAe,EAAC;AAC7D,MAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,QAAQ,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,QAAQ,CAAA,GAAI,EAAC;AACjF,MAAC,KAAK,OAAA,CAAQ,YAAA,CAAa,QAAQ,CAAA,CAAmC,GAAA,CAAI,KAAK,CAAA,GAC3E,GAAA;AACJ,MAAA,IAAA,CAAK,IAAA,EAAK;AAAA,IACd,CAAC,CAAA;AAEL,IAAA,KAAA,MAAW,EAAE,KAAA,EAAO,EAAA,EAAI,EAAA,MAAQ,IAAA,EAAM;AAElC,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AACzC,MAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,MAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,QACrB,KAAA,EAAO,KAAK,KAAA,CAAM,QAAA;AAAA,QAClB,QAAA,EAAU,MAAA;AAAA,QACV,YAAA,EAAc;AAAA,OACjB,CAAA;AAGD,MAAA,MAAM,GAAA,GAAM,WAAW,EAAE,CAAA;AACzB,MAAA,GAAA,CAAI,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,MAAM,CAAA,EAAA,CAAA;AAC3B,MAAA,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,EAAA,CAAA;AAG5B,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI,EAAA,EAAI;AACJ,QAAA,IAAA,GAAO,WAAW,EAAE,CAAA;AACpB,QAAA,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,MAAM,CAAA,EAAA,CAAA;AAC5B,QAAA,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,EAAA,CAAA;AAAA,MACjC,CAAA,MAAO;AACH,QAAA,IAAA,GAAO,QAAA,CAAS,cAAc,MAAM,CAAA;AAAA,MACxC;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,EAAK,GAAA,EAAK,IAAI,CAAA;AAAA,IAC9B;AAEA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA,EAGQ,eAAA,CAAgB,YAAoB,QAAA,EAAiD;AAGzF,IAAA,MAAM,WAAA,GAAc,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,EAAA,CAAA;AAC1C,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,MAAA,CAAO,MAAA,CAAO,KAAK,KAAA,EAAO;AAAA,MACtB,QAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO,MAAA;AAAA,MACP,MAAA,EAAQ,MAAA;AAAA,MACR,YAAA,EAAc,KAAA;AAAA,MACd,QAAA,EAAU,QAAA;AAAA,MACV,MAAA,EAAQ,SAAA;AAAA,MACR,MAAA,EAAQ,eAAe,WAAW,CAAA,CAAA;AAAA,MAClC,UAAA,EAAY,GAAA;AAAA,MACZ,SAAA,EAAW;AAAA,KACd,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,IAAA,MAAA,CAAO,MAAA,CAAO,OAAO,KAAA,EAAO;AAAA,MACxB,QAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO,GAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACf,CAAA;AAED,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,IAAA,KAAA,CAAM,IAAA,GAAO,OAAA;AACb,IAAA,KAAA,CAAM,KAAA,GAAQ,UAAA;AACd,IAAA,MAAA,CAAO,MAAA,CAAO,MAAM,KAAA,EAAO;AAAA,MACvB,QAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO,GAAA;AAAA,MACP,OAAA,EAAS,GAAA;AAAA,MACT,KAAA,EAAO,MAAA;AAAA,MACP,MAAA,EAAQ,MAAA;AAAA,MACR,MAAA,EAAQ,SAAA;AAAA,MACR,OAAA,EAAS,GAAA;AAAA,MACT,MAAA,EAAQ;AAAA,KACX,CAAA;AAED,IAAA,IAAI,aAAA,GAAsD,IAAA;AAC1D,IAAA,KAAA,CAAM,gBAAA,CAAiB,SAAS,MAAM;AAClC,MAAA,MAAA,CAAO,KAAA,CAAM,aAAa,KAAA,CAAM,KAAA;AAChC,MAAA,IAAI,aAAA,KAAkB,IAAA,EAAM,YAAA,CAAa,aAAa,CAAA;AACtD,MAAA,aAAA,GAAgB,WAAW,MAAM;AAC7B,QAAA,aAAA,GAAgB,IAAA;AAChB,QAAA,QAAA,CAAS,MAAM,KAAK,CAAA;AAAA,MACxB,GAAG,GAAG,CAAA;AAAA,IACV,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,KAAK,CAAA;AACzB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA,EAIQ,mBAAA,GAA4B;AAChC,IAAA,MAAM,CAAA,GAAI,KAAK,MAAA,CAAO,QAAA;AAEtB,IAAA,IAAA,CAAK,QAAQ,WAAA,CAAY,IAAA,CAAK,iBAAA,CAAkB,CAAA,CAAE,UAAU,CAAC,CAAA;AAE7D,IAAA,IAAA,CAAK,OAAA,CAAQ,WAAA;AAAA,MACT,IAAA,CAAK,sBAAA;AAAA,QACD,CAAA,CAAE,SAAA;AAAA,QACF,wDAAA;AAAA,QACA,IAAA,CAAK,aAAA;AAAA,UACD;AAAA,YACI,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,EAAE,OAAA,EAAQ;AAAA,YACjC,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,EAAE,aAAA,EAAc;AAAA,YAC7C,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,EAAE,UAAA,EAAW;AAAA,YACvC,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,EAAE,QAAA;AAAS,WACvC;AAAA,UACA,KAAK,OAAA,CAAQ,kBAAA;AAAA,UACb,CAAC,CAAA,KAAM;AACH,YAAA,IAAA,CAAK,QAAQ,kBAAA,GAAqB,CAAA;AAClC,YAAA,IAAA,CAAK,IAAA,EAAK;AAAA,UACd;AAAA;AACJ;AACJ,KACJ;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,WAAA;AAAA,MACT,IAAA,CAAK,sBAAA;AAAA,QACD,CAAA,CAAE,kBAAA;AAAA,QACF,8CAAA;AAAA,QACA,IAAA,CAAK,aAAA;AAAA,UACD;AAAA,YACI,EAAE,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,EAAE,SAAA,EAAU;AAAA,YACpC,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,EAAE,QAAA;AAAS,WACtC;AAAA,UACA,KAAK,OAAA,CAAQ,mBAAA;AAAA,UACb,CAAC,CAAA,KAAM;AACH,YAAA,IAAA,CAAK,QAAQ,mBAAA,GAAsB,CAAA;AACnC,YAAA,IAAA,CAAK,IAAA,EAAK;AAAA,UACd;AAAA;AACJ;AACJ,KACJ;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,WAAA;AAAA,MACT,IAAA,CAAK,wBAAA;AAAA,QACD,mBAAA;AAAA,QACA,gEAAA;AAAA,QACA,KAAK,iBAAA,CAAkB,IAAA,CAAK,OAAA,CAAQ,qBAAA,EAAuB,CAAC,CAAA,KAAM;AAC9D,UAAA,IAAA,CAAK,QAAQ,qBAAA,GAAwB,CAAA;AACrC,UAAA,IAAA,CAAK,IAAA,EAAK;AAAA,QACd,CAAC;AAAA;AACL,KACJ;AAAA,EACJ;AAAA;AAAA,EAIQ,iBAAA,CAAkB,KAAA,EAAe,KAAA,GAAQ,KAAA,EAAuB;AACpE,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACvC,IAAA,EAAA,CAAG,WAAA,GAAc,KAAA;AACjB,IAAA,MAAA,CAAO,MAAA,CAAO,GAAG,KAAA,EAAO;AAAA,MACpB,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAA;AAAA,MAC1B,QAAA,EAAU,MAAA;AAAA,MACV,UAAA,EAAY,KAAA;AAAA,MACZ,aAAA,EAAe,MAAA;AAAA,MACf,SAAA,EAAW,QAAQ,GAAA,GAAM,MAAA;AAAA,MACzB,YAAA,EAAc,KAAA;AAAA,MACd,YAAA,EAAc,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAAA,KACnD,CAAA;AACD,IAAA,OAAO,EAAA;AAAA,EACX;AAAA,EAEQ,sBAAA,CACJ,KAAA,EACA,IAAA,EACA,OAAA,EACc;AACd,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,MACrB,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe,QAAA;AAAA,MACf,GAAA,EAAK,MAAA;AAAA,MACL,OAAA,EAAS,QAAA;AAAA,MACT,YAAA,EAAc,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAAA,KACnD,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,IAAA,MAAA,CAAO,MAAA,CAAO,UAAU,KAAA,EAAO;AAAA,MAC3B,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe,QAAA;AAAA,MACf,GAAA,EAAK;AAAA,KACR,CAAA;AAED,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC7C,IAAA,OAAA,CAAQ,WAAA,GAAc,KAAA;AACtB,IAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,KAAA,EAAO;AAAA,MACzB,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAA;AAAA,MAC1B,QAAA,EAAU,MAAA;AAAA,MACV,UAAA,EAAY;AAAA,KACf,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC5C,IAAA,MAAA,CAAO,WAAA,GAAc,IAAA;AACrB,IAAA,MAAA,CAAO,MAAA,CAAO,OAAO,KAAA,EAAO;AAAA,MACxB,KAAA,EAAO,KAAK,KAAA,CAAM,QAAA;AAAA,MAClB,QAAA,EAAU;AAAA,KACb,CAAA;AAED,IAAA,SAAA,CAAU,MAAA,CAAO,SAAS,MAAM,CAAA;AAEhC,IAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,KAAA,EAAO;AAAA,MACzB,KAAA,EAAO,aAAA;AAAA,MACP,MAAA,EAAQ,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,CAAA;AAAA,MACxC,YAAA,EAAc,KAAA;AAAA,MACd,QAAA,EAAU;AAAA,KACb,CAAA;AACD,IAAA,GAAA,CAAI,MAAA,CAAO,WAAW,OAAO,CAAA;AAC7B,IAAA,OAAO,GAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,wBAAA,CACJ,KAAA,EACA,IAAA,EACA,OAAA,EACc;AACd,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,MACrB,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe,KAAA;AAAA,MACf,UAAA,EAAY,QAAA;AAAA,MACZ,cAAA,EAAgB,eAAA;AAAA,MAChB,GAAA,EAAK,MAAA;AAAA,MACL,OAAA,EAAS,QAAA;AAAA,MACT,YAAA,EAAc,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAAA,KACnD,CAAA;AAED,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,IAAA,MAAA,CAAO,MAAA,CAAO,UAAU,KAAA,EAAO;AAAA,MAC3B,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe,QAAA;AAAA,MACf,GAAA,EAAK,KAAA;AAAA,MACL,IAAA,EAAM,GAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACb,CAAA;AAED,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC7C,IAAA,OAAA,CAAQ,WAAA,GAAc,KAAA;AACtB,IAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,KAAA,EAAO;AAAA,MACzB,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAA;AAAA,MAC1B,QAAA,EAAU,MAAA;AAAA,MACV,UAAA,EAAY;AAAA,KACf,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC5C,IAAA,MAAA,CAAO,WAAA,GAAc,IAAA;AACrB,IAAA,MAAA,CAAO,MAAA,CAAO,OAAO,KAAA,EAAO;AAAA,MACxB,KAAA,EAAO,KAAK,KAAA,CAAM,QAAA;AAAA,MAClB,QAAA,EAAU;AAAA,KACb,CAAA;AAED,IAAA,SAAA,CAAU,MAAA,CAAO,SAAS,MAAM,CAAA;AAEhC,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAChD,IAAA,MAAA,CAAO,MAAA,CAAO,YAAY,KAAA,EAAO;AAAA,MAC7B,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,cAAA,EAAgB,QAAA;AAAA,MAChB,UAAA,EAAY;AAAA,KACf,CAAA;AACD,IAAA,WAAA,CAAY,YAAY,OAAO,CAAA;AAE/B,IAAA,GAAA,CAAI,MAAA,CAAO,WAAW,WAAW,CAAA;AACjC,IAAA,OAAO,GAAA;AAAA,EACX;AAAA;AAAA,EAGQ,aAAA,CACJ,OAAA,EACA,OAAA,EACA,QAAA,EACc;AACd,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,MAAA,CAAO,MAAA,CAAO,KAAK,KAAA,EAAO;AAAA,MACtB,OAAA,EAAS,aAAA;AAAA,MACT,YAAA,EAAc,KAAA;AAAA,MACd,MAAA,EAAQ,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,CAAA;AAAA,MACxC,QAAA,EAAU,QAAA;AAAA,MACV,UAAA,EAAY;AAAA,KACf,CAAA;AAED,IAAA,MAAM,OAA4B,EAAC;AAEnC,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACvB,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,MAAA,MAAM,QAAA,GAAW,IAAI,KAAA,KAAU,OAAA;AAE/B,MAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,QACrB,OAAA,EAAS,UAAA;AAAA,QACT,QAAA,EAAU,MAAA;AAAA,QACV,UAAA,EAAY,gCAAA;AAAA,QACZ,UAAA,EAAY,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAG,MAAA,GAAS,aAAA;AAAA,QAC9C,KAAA,EAAO,QAAA,GAAW,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,QAAA;AAAA,QACzC,MAAA,EAAQ,MAAA;AAAA,QACR,WAAA,EAAa,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,CAAA;AAAA,QAC7C,MAAA,EAAQ,SAAA;AAAA,QACR,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,+BAAA;AAAA,QACZ,UAAA,EAAY,QAAA;AAAA,QACZ,SAAA,EAAW;AAAA,OACd,CAAA;AAED,MAAA,IAAI,GAAA,KAAQ,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA,EAAG;AACrC,QAAA,GAAA,CAAI,MAAM,WAAA,GAAc,MAAA;AAAA,MAC5B;AAEA,MAAA,GAAA,CAAI,cAAc,GAAA,CAAI,KAAA;AAEtB,MAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACrC,QAAA,IAAI,OAAA,KAAY,IAAI,KAAA,EAAO;AACvB,UAAA,GAAA,CAAI,KAAA,CAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,QAAA;AACrC,UAAA,GAAA,CAAI,KAAA,CAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,UAAA;AAAA,QACpC;AAAA,MACJ,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACrC,QAAA,IAAI,OAAA,KAAY,IAAI,KAAA,EAAO;AACvB,UAAA,GAAA,CAAI,MAAM,UAAA,GAAa,aAAA;AACvB,UAAA,GAAA,CAAI,KAAA,CAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,QAAA;AAAA,QACjC;AAAA,MACJ,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,gBAAA,CAAiB,SAAS,MAAM;AAChC,QAAA,OAAA,GAAU,GAAA,CAAI,KAAA;AACd,QAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AAClB,UAAA,CAAA,CAAE,MAAM,UAAA,GAAa,aAAA;AACrB,UAAA,CAAA,CAAE,KAAA,CAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,QAAA;AAAA,QAC/B;AACA,QAAA,GAAA,CAAI,KAAA,CAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,MAAA;AACrC,QAAA,GAAA,CAAI,MAAM,KAAA,GAAQ,SAAA;AAClB,QAAA,QAAA,CAAS,IAAI,KAAK,CAAA;AAAA,MACtB,CAAC,CAAA;AAED,MAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AACb,MAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AAAA,IACxB;AAEA,IAAA,OAAO,IAAA;AAAA,EACX;AACJ,CAAA;;;ACn6BO,IAAM,cAAN,MAAkB;AAAA,EAOrB,WAAA,CACI,OACA,cAAA,EACA,OAAA,EACA,SAAsB,cAAA,CAAe,KAAA,EACrC,MAA2B,2BAAA,EAC7B;AATF,IAAA,IAAA,CAAQ,QAAA,GAAW,KAAA;AACnB,IAAA,IAAA,CAAQ,SAAA,GAAY,KAAA;AAShB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,GAAA,GAAQ,GAAA;AAEb,IAAA,IAAA,CAAK,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACzC,IAAA,IAAA,CAAK,GAAG,SAAA,GAAY,gBAAA;AACpB,IAAA,IAAA,CAAK,EAAA,CAAG,QAAQ,MAAA,CAAO,eAAA;AACvB,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO;AAAA,MACzB,QAAA,EAAc,UAAA;AAAA,MACd,KAAA,EAAc,CAAA,EAAG,cAAA,GAAiB,EAAE,CAAA,EAAA,CAAA;AAAA,MACpC,GAAA,EAAc,GAAA;AAAA,MACd,KAAA,EAAc,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,EAAA,CAAA;AAAA,MACzB,MAAA,EAAc,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,EAAA,CAAA;AAAA,MACzB,YAAA,EAAc,KAAA;AAAA,MACd,MAAA,EAAc,CAAA,UAAA,EAAa,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MAC3C,UAAA,EAAc,MAAM,OAAA,CAAQ,UAAA;AAAA,MAC5B,OAAc,KAAA,CAAM,QAAA;AAAA,MACpB,QAAA,EAAc,MAAA;AAAA,MACd,UAAA,EAAc,GAAA;AAAA,MACd,OAAA,EAAc,MAAA;AAAA,MACd,UAAA,EAAc,QAAA;AAAA,MACd,cAAA,EAAgB,QAAA;AAAA,MAChB,MAAA,EAAc,SAAA;AAAA,MACd,OAAA,EAAc,GAAA;AAAA,MACd,UAAA,EAAY,gCAAA;AAAA,MACZ,MAAA,EAAc,IAAA;AAAA,MACd,SAAA,EAAc,kBAAA;AAAA,MACd,UAAA,EAAc,cAAA;AAAA,MACd,aAAA,EAAe,MAAA;AAAA,MACf,UAAA,EAAc;AAAA,KACjB,CAAA;AAED,IAAA,IAAA,CAAK,aAAA,CAAc,IAAI,QAAQ,CAAA;AAE/B,IAAA,IAAA,CAAK,EAAA,CAAG,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACrC,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,OAAA,EAAQ;AAAA,IACZ,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,EAAA,CAAG,gBAAA,CAAiB,YAAA,EAAc,MAAM;AACzC,MAAA,IAAA,CAAK,EAAA,CAAG,MAAM,OAAA,GAAU,GAAA;AACxB,MAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO;AAAA,QACzB,UAAA,EAAY,MAAM,OAAA,CAAQ,UAAA;AAAA,QAC1B,KAAA,EAAY,MAAM,WAAA,CAAY,OAAA;AAAA,QAC9B,MAAA,EAAY,CAAA,UAAA,EAAa,KAAA,CAAM,WAAA,CAAY,OAAO,CAAA;AAAA,OACrD,CAAA;AAAA,IACL,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,EAAA,CAAG,gBAAA,CAAiB,YAAA,EAAc,CAAC,CAAA,KAAM;AAC1C,MAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO;AAAA,QACzB,UAAA,EAAY,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,UAAA;AAAA,QAC/B,KAAA,EAAY,KAAK,KAAA,CAAM,QAAA;AAAA,QACvB,MAAA,EAAY,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAAA,OACjD,CAAA;AAED,MAAA,MAAM,UAAU,CAAA,CAAE,aAAA;AAClB,MAAA,IAAI,CAAC,WAAW,CAAC,IAAA,CAAK,GAAG,aAAA,EAAe,QAAA,CAAS,OAAO,CAAA,EAAG;AACvD,QAAA,IAAA,CAAK,IAAA,EAAK;AAAA,MACd;AAAA,IACJ,CAAC,CAAA;AAAA,EACL;AAAA;AAAA,EAGA,KAAK,CAAA,EAAiB;AAClB,IAAA,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,CAAC,CAAA,EAAA,CAAA;AAAA,EAC5B;AAAA,EAEA,IAAA,GAAa;AACT,IAAA,IAAI,KAAK,QAAA,EAAU;AACnB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,EAAA,CAAG,MAAM,OAAA,GAAU,MAAA;AAAA,EAC5B;AAAA,EAEA,IAAA,GAAa;AACT,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AACpB,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAChB,IAAA,IAAA,CAAK,EAAA,CAAG,MAAM,OAAA,GAAU,MAAA;AAAA,EAC5B;AAAA,EAEA,QAAA,CAAS,OAAmB,cAAA,EAA8B;AACtD,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO;AAAA,MACzB,MAAA,EAAY,CAAA,UAAA,EAAa,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MACzC,UAAA,EAAY,MAAM,OAAA,CAAQ,UAAA;AAAA,MAC1B,OAAY,KAAA,CAAM,QAAA;AAAA,MAClB,KAAA,EAAY,CAAA,EAAG,cAAA,GAAiB,EAAE,CAAA,EAAA;AAAA,KACrC,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,QAAA,EAAyB;AACnC,IAAA,IAAI,IAAA,CAAK,cAAc,QAAA,EAAU;AACjC,IAAA,IAAA,CAAK,SAAA,GAAY,QAAA;AACjB,IAAA,MAAM,OAAW,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,UAAA,GAAiB,KAAK,GAAA,CAAI,IAAA;AAC/D,IAAA,MAAM,WAAW,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,cAAA,GAAiB,KAAK,GAAA,CAAI,QAAA;AAC/D,IAAA,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,KAAA,GAAS,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA;AAC9B,IAAA,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA;AAC9B,IAAA,IAAA,CAAK,cAAc,QAAQ,CAAA;AAAA,EAC/B;AAAA,EAEQ,cAAc,IAAA,EAAoB;AACtC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,EAAA,CAAG,aAAA,CAAc,KAAK,CAAA;AACvC,IAAA,IAAI,GAAA,EAAK;AACL,MAAA,GAAA,CAAI,YAAA,CAAa,OAAA,EAAS,MAAA,CAAO,IAAI,CAAC,CAAA;AACtC,MAAA,GAAA,CAAI,YAAA,CAAa,QAAA,EAAU,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,IAC3C;AAAA,EACJ;AACJ,CAAA;;;AC3HO,IAAM,eAAN,MAAmB;AAAA,EActB,WAAA,CACI,OACA,IAAA,EACA,MAAA,EACA,eACA,MAAA,GAA6B,cAAA,CAAe,OAC5C,kBAAA,EACF;AAdF,IAAA,IAAA,CAAQ,MAAA,GAAkB,CAAA;AAC1B,IAAA,IAAA,CAAQ,eAAA,GAAkB,CAAA;AAC1B,IAAA,IAAA,CAAQ,aAAA,GAAmC,OAAA;AAC3C,IAAA,IAAA,CAAQ,cAAA,GAAmC,OAAA;AAC3C,IAAA,IAAA,CAAQ,QAAA,GAAkB,KAAA;AAoL1B,IAAA,IAAA,CAAQ,cAAA,GAAiB,CAAC,CAAA,KAAwB;AAC9C,MAAA,IAAI,IAAA,CAAK,aAAa,CAAC,IAAA,CAAK,GAAG,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,EAAG;AACvD,QAAA,IAAA,CAAK,IAAA,EAAK;AAAA,MACd;AAAA,IACJ,CAAA;AA7KI,IAAA,IAAA,CAAK,KAAA,GAAgB,KAAA;AACrB,IAAA,IAAA,CAAK,IAAA,GAAgB,IAAA;AACrB,IAAA,IAAA,CAAK,MAAA,GAAgB,MAAA;AACrB,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AACrB,IAAA,IAAA,CAAK,MAAA,GAAgB,MAAA;AACrB,IAAA,IAAA,CAAK,kBAAA,GAAqB,kBAAA;AAE1B,IAAA,IAAA,CAAK,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACtC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO;AAAA,MACzB,QAAA,EAAe,UAAA;AAAA,MACf,OAAA,EAAe,MAAA;AAAA,MACf,aAAA,EAAe,QAAA;AAAA,MACf,UAAA,EAAe,MAAM,OAAA,CAAQ,UAAA;AAAA,MAC7B,MAAA,EAAe,CAAA,UAAA,EAAa,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MAC5C,YAAA,EAAe,KAAA;AAAA,MACf,OAAA,EAAe,KAAA;AAAA,MACf,MAAA,EAAe,IAAA;AAAA,MACf,SAAA,EAAe,6BAAA;AAAA,MACf,UAAA,EAAe,gCAAA;AAAA,MACf,QAAA,EAAe,MAAA;AAAA,MACf,KAAA,EAAe,aAAA;AAAA,MACf,aAAA,EAAe;AAAA,KAClB,CAAA;AAED,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAA,EAAa,IAAA,CAAK,cAAc,CAAA;AAAA,EAC9D;AAAA;AAAA,EAIA,IAAA,CACI,OACA,OAAA,EACA,WAAA,EACA,iBAAkB,CAAA,EAClB,YAAA,GAAmC,OAAA,EACnC,aAAA,GAAmC,OAAA,EAC/B;AACJ,IAAA,MAAM,aAAa,IAAA,CAAK,SAAA;AACxB,IAAA,IAAA,CAAK,MAAA,GAAkB,KAAA;AACvB,IAAA,IAAA,CAAK,eAAA,GAAkB,cAAA;AACvB,IAAA,IAAA,CAAK,aAAA,GAAkB,YAAA;AACvB,IAAA,IAAA,CAAK,cAAA,GAAkB,aAAA;AACvB,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,IAAA,CAAK,EAAA,CAAG,MAAM,OAAA,GAAU,MAAA;AAExB,IAAA,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAG,WAAW,CAAA,EAAA,CAAA;AACpC,IAAA,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,GAAA,GAAQ,CAAA,EAAG,UAAU,EAAE,CAAA,EAAA,CAAA;AAErC,IAAA,IAAI,CAAC,UAAA,EAAY,IAAA,CAAK,kBAAA,IAAqB;AAAA,EAC/C;AAAA,EAEA,IAAA,GAAa;AACT,IAAA,MAAM,aAAa,IAAA,CAAK,SAAA;AACxB,IAAA,IAAA,CAAK,EAAA,CAAG,MAAM,OAAA,GAAU,MAAA;AACxB,IAAA,IAAI,UAAA,OAAiB,kBAAA,IAAqB;AAAA,EAC9C;AAAA,EAEA,IAAI,SAAA,GAAqB;AACrB,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,OAAA,KAAY,MAAA;AAAA,EACrC;AAAA,EAEA,QAAQ,IAAA,EAAoB;AACxB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EAChB;AAAA,EAEA,UAAU,MAAA,EAAsB;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAClB;AAAA,EAEA,WAAW,OAAA,EAAwB;AAC/B,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAAA,EACpB;AAAA,EAEA,SAAS,KAAA,EAAyB;AAC9B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO;AAAA,MACzB,UAAA,EAAY,MAAM,OAAA,CAAQ,UAAA;AAAA,MAC1B,MAAA,EAAY,CAAA,UAAA,EAAa,KAAA,CAAM,UAAU,CAAA;AAAA,KAC5C,CAAA;AAAA,EACL;AAAA,EAEA,OAAA,GAAgB;AACZ,IAAA,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,IAAA,CAAK,cAAc,CAAA;AAAA,EACjE;AAAA;AAAA,EAIQ,OAAA,GAAgB;AACpB,IAAA,IAAA,CAAK,GAAG,SAAA,GAAY,EAAA;AAEpB,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,IAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,KAAA,EAAO;AAAA,MACzB,MAAA,EAAY,KAAA;AAAA,MACZ,UAAA,EAAY,KAAK,KAAA,CAAM,UAAA;AAAA,MACvB,MAAA,EAAY;AAAA,KACf,CAAA;AAED,IAAA,IAAA,CAAK,EAAA,CAAG,MAAA;AAAA,MACJ,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA,CAAM,YAAY,QAAA,EAAU,MAAA,EAAQ,KAAK,cAAc,CAAA;AAAA,MACzE,OAAA;AAAA,MACA,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA,CAAM,YAAY,OAAA,EAAU,KAAA,EAAQ,KAAK,aAAa;AAAA,KAC5E;AAAA,EACJ;AAAA,EAEQ,OAAA,CACJ,KAAA,EACA,IAAA,EACA,SAAA,EACiB;AACjB,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,IAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,MACrB,OAAA,EAAc,MAAA;AAAA,MACd,UAAA,EAAc,QAAA;AAAA,MACd,GAAA,EAAc,KAAA;AAAA,MACd,KAAA,EAAc,MAAA;AAAA,MACd,UAAA,EAAc,aAAA;AAAA,MACd,MAAA,EAAc,MAAA;AAAA,MACd,YAAA,EAAc,KAAA;AAAA,MACd,OAAA,EAAc,IAAA,CAAK,QAAA,GAAW,SAAA,GAAY,UAAA;AAAA,MAC1C,MAAA,EAAc,SAAA;AAAA,MACd,UAAA,EAAc,gCAAA;AAAA,MACd,QAAA,EAAc,IAAA,CAAK,QAAA,GAAW,MAAA,GAAS;AAAA,KAC1C,CAAA;AAED,IAAA,GAAA,CAAI,WAAA,CAAY,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,IAAI,CAAC,CAAA;AAE7C,IAAA,MAAM,YAAiB,IAAA,KAAS,MAAA,GAAS,KAAK,MAAA,CAAO,IAAA,GAAO,KAAK,MAAA,CAAO,GAAA;AACxE,IAAA,MAAM,iBAAiB,SAAA,KAAc,OAAA,GAAU,KAAK,MAAA,CAAO,KAAA,GAAQ,KAAK,MAAA,CAAO,IAAA;AAC/E,IAAA,MAAM,QAAA,GAAiB,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,eAAe,CAAA;AAE/D,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC7C,IAAA,OAAA,CAAQ,WAAA,GAAc,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,cAAc,CAAA,CAAA;AACpD,IAAA,MAAA,CAAO,OAAO,OAAA,CAAQ,KAAA,EAAO,EAAE,KAAA,EAAO,UAAA,EAAY,OAAO,CAAA;AAEzD,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC3C,IAAA,KAAA,CAAM,WAAA,GAAc,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,CAAO,EAAE,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAC9E,IAAA,MAAA,CAAO,MAAA,CAAO,MAAM,KAAA,EAAO,EAAE,OAAO,SAAA,EAAW,UAAA,EAAY,OAAO,CAAA;AAElE,IAAA,GAAA,CAAI,MAAA,CAAO,SAAS,KAAK,CAAA;AAEzB,IAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AAAE,MAAA,GAAA,CAAI,MAAM,UAAA,GAAa,wBAAA;AAAA,IAA0B,CAAC,CAAA;AAC7F,IAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AAAE,MAAA,GAAA,CAAI,MAAM,UAAA,GAAa,aAAA;AAAA,IAAe,CAAC,CAAA;AAClF,IAAA,GAAA,CAAI,gBAAA,CAAiB,WAAA,EAAa,CAAC,CAAA,KAAM;AACrC,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,IAAA,CAAK,aAAA,CAAc,IAAA,EAAM,IAAA,CAAK,MAAA,EAAQ,SAAS,CAAA;AAC/C,MAAA,IAAA,CAAK,IAAA,EAAK;AAAA,IACd,CAAC,CAAA;AACD,IAAA,OAAO,GAAA;AAAA,EACX;AAAA,EAEQ,WAAA,CAAY,OAAe,IAAA,EAAqC;AACpE,IAAA,MAAM,EAAA,GAAM,4BAAA;AACZ,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,eAAA,CAAgB,EAAA,EAAI,KAAK,CAAA;AAC9C,IAAA,GAAA,CAAI,YAAA,CAAa,SAAW,IAAI,CAAA;AAChC,IAAA,GAAA,CAAI,YAAA,CAAa,UAAW,GAAG,CAAA;AAC/B,IAAA,GAAA,CAAI,YAAA,CAAa,WAAW,UAAU,CAAA;AACtC,IAAA,GAAA,CAAI,MAAM,UAAA,GAAa,GAAA;AAEvB,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,eAAA,CAAgB,EAAA,EAAI,MAAM,CAAA;AAChD,IAAA,IAAA,CAAK,YAAA,CAAa,GAAA,EAAK,IAAA,KAAS,MAAA,GAAS,mBAAmB,gBAAgB,CAAA;AAC5E,IAAA,IAAA,CAAK,YAAA,CAAa,UAAoB,KAAK,CAAA;AAC3C,IAAA,IAAA,CAAK,YAAA,CAAa,QAAoB,MAAM,CAAA;AAC5C,IAAA,IAAA,CAAK,YAAA,CAAa,gBAAoB,KAAK,CAAA;AAC3C,IAAA,IAAA,CAAK,YAAA,CAAa,kBAAoB,OAAO,CAAA;AAC7C,IAAA,IAAA,CAAK,YAAA,CAAa,mBAAoB,OAAO,CAAA;AAC7C,IAAA,GAAA,CAAI,YAAY,IAAI,CAAA;AACpB,IAAA,OAAO,GAAA;AAAA,EACX;AAOJ,CAAA;;;AChMA,IAAM,gBAAA,GAAmE;AAAA;AAAA,EAErE,cAAA,EAAiB,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC5C,YAAA,EAAiB,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC5C,SAAA,EAAiB,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC5C,SAAA,EAAiB,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC5C,UAAA,EAAiB,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC5C,eAAA,EAAiB,CAAC,QAAA,EAAU,OAAA,EAAS,SAAS,MAAM,CAAA;AAAA,EACpD,WAAA,EAAiB,CAAC,QAAA,EAAU,OAAA,EAAS,SAAS,MAAM,CAAA;AAAA,EACpD,eAAA,EAAiB,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA;AAAA,EAE5C,SAAA,EAAkB,CAAC,QAAA,EAAU,OAAA,EAAS,SAAS,MAAM,CAAA;AAAA,EACrD,gBAAA,EAAkB,CAAC,QAAA,EAAU,OAAA,EAAS,SAAS,MAAM,CAAA;AAAA,EACrD,OAAA,EAAkB,CAAC,QAAA,EAAU,OAAA,EAAS,SAAS,MAAM,CAAA;AAAA,EACrD,MAAA,EAAkB,CAAC,QAAA,EAAU,OAAA,EAAS,SAAS,MAAM,CAAA;AAAA,EACrD,QAAA,EAAkB,CAAC,QAAA,EAAU,OAAA,EAAS,SAAS,MAAM,CAAA;AAAA,EACrD,GAAA,EAAkB,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC7C,IAAA,EAAkB,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC7C,QAAA,EAAkB,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC7C,QAAA,EAAkB,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC7C,KAAA,EAAkB,CAAC,QAAA,EAAU,OAAO,CAAA;AAAA,EACpC,WAAA,EAAkB,CAAC,QAAA,EAAU,OAAO,CAAA;AAAA;AAAA,EAEpC,cAAA,EAAiB,CAAC,OAAA,EAAS,OAAA,EAAS,WAAW,CAAA;AAAA,EAC/C,YAAA,EAAiB,CAAC,OAAA,EAAS,OAAA,EAAS,WAAW,CAAA;AAAA,EAC/C,aAAA,EAAiB,CAAC,OAAA,EAAS,OAAA,EAAS,WAAW,CAAA;AAAA,EAC/C,UAAA,EAAiB,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC5C,MAAA,EAAiB,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC5C,UAAA,EAAiB,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC5C,SAAA,EAAiB,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC5C,WAAA,EAAiB,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA;AAAA,EAE5C,OAAA,EAAY,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EACvC,UAAA,EAAY,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EACvC,OAAA,EAAY,CAAC,QAAA,EAAU,OAAA,EAAS,SAAS,MAAM,CAAA;AAAA;AAAA,EAE/C,SAAA,EAAiB,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC5C,eAAA,EAAiB,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC5C,cAAA,EAAiB,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC5C,eAAA,EAAiB,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA;AAAA,EAE5C,IAAA,EAAc,CAAC,MAAM,CAAA;AAAA,EACrB,OAAA,EAAc,CAAC,MAAA,EAAQ,QAAA,EAAU,MAAM,CAAA;AAAA,EACvC,UAAA,EAAc,CAAC,MAAA,EAAQ,MAAM,CAAA;AAAA,EAC7B,SAAA,EAAc,CAAC,MAAA,EAAQ,QAAQ,CAAA;AAAA,EAC/B,YAAA,EAAc,CAAC,MAAA,EAAQ,QAAA,EAAU,MAAM,CAAA;AAAA;AAAA,EAEvC,OAAA,EAAa,CAAC,QAAA,EAAU,MAAM,CAAA;AAAA,EAC9B,SAAA,EAAa,CAAC,QAAA,EAAU,MAAM,CAAA;AAAA,EAC9B,WAAA,EAAa,CAAC,QAAA,EAAU,MAAM,CAAA;AAAA,EAC9B,IAAA,EAAa,CAAC,QAAA,EAAU,MAAM,CAAA;AAAA;AAAA,EAE9B,aAAA,EAAe,CAAC,QAAA,EAAU,MAAM,CAAA;AAAA,EAChC,UAAA,EAAe,CAAC,QAAA,EAAU,MAAM,CAAA;AAAA,EAChC,YAAA,EAAe,CAAC,QAAA,EAAU,MAAM,CAAA;AAAA;AAAA,EAEhC,UAAA,EAAgB,CAAC,QAAA,EAAU,MAAM,CAAA;AAAA,EACjC,SAAA,EAAgB,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC3C,cAAA,EAAgB,CAAC,QAAA,EAAU,MAAM,CAAA;AAAA,EACjC,KAAA,EAAgB,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA;AAAA,EAE3C,eAAA,EAAiB,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC5C,UAAA,EAAiB,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC5C,WAAA,EAAiB,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EAC5C,UAAA,EAAiB,CAAC,QAAA,EAAU,OAAA,EAAS,SAAS,MAAM,CAAA;AAAA,EACpD,eAAA,EAAiB,CAAC,QAAA,EAAU,MAAM,CAAA;AAAA,EAClC,SAAA,EAAiB,CAAC,QAAA,EAAU,MAAM;AACtC,CAAA;AAIA,IAAM,WAAA,GAAc,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAC/B,IAAM,UAAA,GAAa,CAAC,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AACtD,IAAM,SAAA,GAAY,EAAA;AAQX,IAAM,sBAAN,MAA0B;AAAA,EAS7B,WAAA,CACI,SAAA,EACA,KAAA,EACA,QAAA,EACF;AARF,IAAA,IAAA,CAAQ,cAAA,GAAkC,IAAA;AAC1C,IAAA,IAAA,CAAQ,iBAAA,GAAoB,KAAA;AAC5B,IAAA,IAAA,CAAQ,QAAA,GAAkC,IAAA;AAOtC,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAEhB,IAAA,IAAA,CAAK,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACtC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO;AAAA,MACzB,QAAA,EAAe,UAAA;AAAA,MACf,OAAA,EAAe,MAAA;AAAA,MACf,aAAA,EAAe,KAAA;AAAA,MACf,UAAA,EAAe,QAAA;AAAA,MACf,GAAA,EAAe,MAAA;AAAA,MACf,UAAA,EAAe,MAAM,OAAA,CAAQ,UAAA;AAAA,MAC7B,MAAA,EAAe,CAAA,UAAA,EAAa,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MAC5C,YAAA,EAAe,KAAA;AAAA,MACf,OAAA,EAAe,UAAA;AAAA,MACf,MAAA,EAAe,IAAA;AAAA,MACf,SAAA,EAAe,6BAAA;AAAA,MACf,UAAA,EAAe,gCAAA;AAAA,MACf,QAAA,EAAe,MAAA;AAAA,MACf,KAAA,EAAe,MAAM,OAAA,CAAQ,IAAA;AAAA,MAC7B,aAAA,EAAe,MAAA;AAAA,MACf,UAAA,EAAe,MAAA;AAAA,MACf,UAAA,EAAe;AAAA,KAClB,CAAA;AACD,IAAA,SAAA,CAAU,WAAA,CAAY,KAAK,EAAE,CAAA;AAAA,EACjC;AAAA,EAEA,SAAS,KAAA,EAAyB;AAC9B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,UAAA;AACzC,IAAA,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,MAAA,GAAS,CAAA,UAAA,EAAa,MAAM,UAAU,CAAA,CAAA;AACpD,IAAA,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,IAAA;AACpC,IAAA,IAAI,IAAA,CAAK,cAAA,EAAgB,IAAA,CAAK,OAAA,EAAQ;AAAA,EAC1C;AAAA;AAAA,EAGA,IAAA,CAAK,OAAA,EAAmB,CAAA,EAAW,CAAA,EAAiB;AAChD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,cAAA,EAAgB,EAAA,KAAO,OAAA,CAAQ,EAAA;AACtD,IAAA,IAAA,CAAK,cAAA,GAAiB,OAAA;AACtB,IAAA,IAAI,CAAC,SAAA,EAAW;AACZ,MAAA,IAAA,CAAK,iBAAA,GAAoB,KAAA;AACzB,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACjB;AACA,IAAA,IAAA,CAAK,EAAA,CAAG,MAAM,OAAA,GAAU,MAAA;AACxB,IAAA,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,EACvB;AAAA;AAAA,EAGA,SAAA,CAAU,GAAW,CAAA,EAAiB;AAClC,IAAA,qBAAA,CAAsB,MAAM;AACxB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,EAAA,CAAG,qBAAA,EAAsB;AAC3C,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,qBAAA,EAAsB;AACnD,MAAA,MAAM,CAAA,GAAI,KAAK,KAAA,IAAS,GAAA;AACxB,MAAA,MAAM,CAAA,GAAI,KAAK,MAAA,IAAU,EAAA;AACzB,MAAA,IAAI,IAAA,GAAO,IAAI,CAAA,GAAI,CAAA;AACnB,MAAA,IAAI,GAAA,GAAO,IAAI,CAAA,GAAI,EAAA;AACnB,MAAA,IAAI,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,CAAA,GAAI,EAAA;AACvB,MAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,MAAM,KAAA,GAAQ,CAAA,GAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AACtD,MAAA,GAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,MAAM,MAAA,GAAS,CAAA,GAAI,CAAA,EAAG,GAAG,CAAC,CAAA;AACtD,MAAA,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA;AAC5B,MAAA,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,GAAA,GAAO,CAAA,EAAG,GAAG,CAAA,EAAA,CAAA;AAAA,IAC/B,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,IAAA,GAAa;AACT,IAAA,IAAA,CAAK,EAAA,CAAG,MAAM,OAAA,GAAU,MAAA;AACxB,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,IAAA,IAAA,CAAK,iBAAA,GAAoB,KAAA;AACzB,IAAA,IAAA,CAAK,UAAU,MAAA,EAAO;AACtB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EACpB;AAAA,EAEA,OAAA,GAAgB;AACZ,IAAA,IAAA,CAAK,UAAU,MAAA,EAAO;AACtB,IAAA,IAAA,CAAK,GAAG,MAAA,EAAO;AACf,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,EAC1B;AAAA;AAAA,EAIQ,OAAA,GAAgB;AACpB,IAAA,IAAA,CAAK,GAAG,SAAA,GAAY,EAAA;AACpB,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AAE1B,IAAA,MAAM,QAAA,GAAW,iBAAiB,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA,IAAK,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAC1F,IAAA,MAAM,KAAA,GAAS,IAAA,CAAK,cAAA,CAAe,KAAA,IAAS,EAAC;AAC7C,IAAA,MAAM,UAAA,GAAc,KAAK,KAAA,CAAM,OAAA,CAAQ,KAAK,cAAA,CAAe,IAAI,KAAK,EAAC;AAErE,IAAA,MAAM,SAAwB,EAAC;AAE/B,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AACxB,MAAA,QAAQ,GAAA;AAAK,QACT,KAAK,QAAA;AACD,UAAA,MAAA,CAAO,KAAK,IAAA,CAAK,KAAA;AAAA,YAAM,OAAA;AAAA,YACnB,IAAA,CAAK,eAAA;AAAA,cACD,KAAA,CAAM,WAAA,IAAe,UAAA,CAAW,WAAA,IAAe,SAAA;AAAA,cAC/C,CAAC,GAAA,KAAQ,IAAA,CAAK,KAAK,EAAE,WAAA,EAAa,KAAK;AAAA;AAC3C,WACH,CAAA;AACD,UAAA;AAAA,QACJ,KAAK,OAAA;AACD,UAAA,MAAA,CAAO,KAAK,IAAA,CAAK,KAAA;AAAA,YAAM,OAAA;AAAA,YACnB,IAAA,CAAK,UAAA;AAAA,cACD,KAAA,CAAM,SAAA,IAAa,UAAA,CAAW,SAAA,IAAa,CAAA;AAAA,cAC3C,CAAC,CAAA,KAAM,IAAA,CAAK,KAAK,EAAE,SAAA,EAAW,GAAG;AAAA;AACrC,WACH,CAAA;AACD,UAAA;AAAA,QACJ,KAAK,OAAA;AACD,UAAA,MAAA,CAAO,KAAK,IAAA,CAAK,KAAA;AAAA,YAAM,OAAA;AAAA,YACnB,IAAA,CAAK,cAAA;AAAA,cACD,KAAA,CAAM,SAAA,IAAa,UAAA,CAAW,SAAA,IAAa,OAAA;AAAA,cAC3C,CAAC,CAAA,KAAM,IAAA,CAAK,KAAK,EAAE,SAAA,EAAW,GAAG;AAAA;AACrC,WACH,CAAA;AACD,UAAA;AAAA,QACJ,KAAK,MAAA,EAAQ;AACT,UAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,UAAA,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,EAAE,OAAA,EAAS,QAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,KAAA,EAAO,CAAA;AAClF,UAAA,OAAA,CAAQ,YAAY,IAAA,CAAK,eAAA;AAAA,YACrB,KAAA,CAAM,SAAA,IAAa,UAAA,CAAW,SAAA,IAAa,SAAA;AAAA,YAC3C,CAAC,GAAA,KAAQ,IAAA,CAAK,KAAK,EAAE,SAAA,EAAW,KAAK;AAAA,WACxC,CAAA;AACD,UAAA,OAAA,CAAQ,YAAY,IAAA,CAAK,YAAA;AAAA,YACrB,KAAA,CAAM,WAAA,IAAe,UAAA,CAAW,WAAA,IAAe,GAAA;AAAA,YAC/C,CAAC,CAAA,KAAM,IAAA,CAAK,KAAK,EAAE,WAAA,EAAa,GAAG;AAAA,WACtC,CAAA;AACD,UAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,OAAO,CAAC,CAAA;AACvC,UAAA;AAAA,QACJ;AAAA,QACA,KAAK,MAAA,EAAQ;AACT,UAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC5C,UAAA,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,EAAE,OAAA,EAAS,QAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,KAAA,EAAO,CAAA;AAClF,UAAA,OAAA,CAAQ,YAAY,IAAA,CAAK,eAAA;AAAA,YACrB,KAAA,CAAM,SAAA,IAAa,UAAA,CAAW,SAAA,IAAa,SAAA;AAAA,YAC3C,CAAC,GAAA,KAAQ,IAAA,CAAK,KAAK,EAAE,SAAA,EAAW,KAAkC;AAAA,WACrE,CAAA;AACD,UAAA,OAAA,CAAQ,YAAY,IAAA,CAAK,aAAA;AAAA,YACrB,KAAA,CAAM,QAAA,IAAY,UAAA,CAAW,QAAA,IAAY,EAAA;AAAA,YACzC,CAAC,IAAA,KAAS,IAAA,CAAK,KAAK,EAAE,QAAA,EAAU,MAAmC;AAAA,WACtE,CAAA;AACD,UAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,OAAO,CAAC,CAAA;AACvC,UAAA;AAAA,QACJ;AAAA,QACA,KAAK,WAAA;AACD,UAAA,MAAA,CAAO,KAAK,IAAA,CAAK,KAAA;AAAA,YAAM,QAAA;AAAA,YACnB,IAAA,CAAK,oBAAA,CAAqB,EAAE,GAAI,UAAA,CAAW,MAAA,IAAU,EAAC,EAAI,GAAI,KAAA,CAAM,MAAA,IAAU,IAAK;AAAA,WACtF,CAAA;AACD,UAAA;AAAA;AACR,IACJ;AAGA,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACrB,MAAA,IAAI,IAAI,CAAA,EAAG,IAAA,CAAK,GAAG,WAAA,CAAY,IAAA,CAAK,eAAe,CAAA;AACnD,MAAA,IAAA,CAAK,EAAA,CAAG,YAAY,CAAC,CAAA;AAAA,IACzB,CAAC,CAAA;AAAA,EACL;AAAA;AAAA,EAIQ,KAAA,CAAM,OAAe,OAAA,EAAsC;AAC/D,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,MAAA,CAAO,MAAA,CAAO,KAAK,KAAA,EAAO;AAAA,MACtB,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe,QAAA;AAAA,MACf,UAAA,EAAY,YAAA;AAAA,MACZ,GAAA,EAAK;AAAA,KACR,CAAA;AACD,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AACzC,IAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,IAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,MACrB,QAAA,EAAU,MAAA;AAAA,MACV,KAAA,EAAO,KAAK,KAAA,CAAM,QAAA;AAAA,MAClB,aAAA,EAAe,WAAA;AAAA,MACf,aAAA,EAAe,OAAA;AAAA,MACf,UAAA,EAAY;AAAA,KACf,CAAA;AACD,IAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AACpB,IAAA,IAAA,CAAK,YAAY,OAAO,CAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEQ,aAAA,GAAgC;AACpC,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,MACrB,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ,MAAA;AAAA,MACR,UAAA,EAAY,KAAK,KAAA,CAAM,UAAA;AAAA,MACvB,OAAA,EAAS;AAAA,KACZ,CAAA;AACD,IAAA,OAAO,GAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,eAAA,CAAgB,YAAoB,QAAA,EAAiD;AACzF,IAAA,MAAM,WAAA,GAAc,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA,EAAA,CAAA;AAC1C,IAAA,MAAM,OAAA,GAAU,WAAW,MAAA,KAAW,CAAA,IAAK,WAAW,UAAA,CAAW,GAAG,IAAI,UAAA,GAAa,SAAA;AAErF,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,MAAA,CAAO,MAAA,CAAO,KAAK,KAAA,EAAO;AAAA,MACtB,QAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO,GAAG,SAAS,CAAA,EAAA,CAAA;AAAA,MACnB,MAAA,EAAQ,GAAG,SAAS,CAAA,EAAA,CAAA;AAAA,MACpB,YAAA,EAAc,KAAA;AAAA,MACd,QAAA,EAAU,QAAA;AAAA,MACV,MAAA,EAAQ,SAAA;AAAA,MACR,MAAA,EAAQ,eAAe,WAAW,CAAA,CAAA;AAAA,MAClC,UAAA,EAAY,GAAA;AAAA,MACZ,SAAA,EAAW;AAAA,KACd,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,IAAA,MAAA,CAAO,MAAA,CAAO,OAAO,KAAA,EAAO;AAAA,MACxB,QAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO,GAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACf,CAAA;AAED,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,IAAA,KAAA,CAAM,IAAA,GAAO,OAAA;AACb,IAAA,KAAA,CAAM,KAAA,GAAQ,OAAA;AACd,IAAA,MAAA,CAAO,MAAA,CAAO,MAAM,KAAA,EAAO;AAAA,MACvB,QAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO,GAAA;AAAA,MACP,OAAA,EAAS,GAAA;AAAA,MACT,KAAA,EAAO,MAAA;AAAA,MACP,MAAA,EAAQ,MAAA;AAAA,MACR,MAAA,EAAQ,SAAA;AAAA,MACR,OAAA,EAAS,GAAA;AAAA,MACT,MAAA,EAAQ;AAAA,KACX,CAAA;AAED,IAAA,IAAI,aAAA,GAAsD,IAAA;AAC1D,IAAA,KAAA,CAAM,gBAAA,CAAiB,SAAS,MAAM;AAClC,MAAA,MAAA,CAAO,KAAA,CAAM,aAAa,KAAA,CAAM,KAAA;AAChC,MAAA,IAAI,aAAA,KAAkB,IAAA,EAAM,YAAA,CAAa,aAAa,CAAA;AACtD,MAAA,aAAA,GAAgB,WAAW,MAAM;AAC7B,QAAA,aAAA,GAAgB,IAAA;AAChB,QAAA,QAAA,CAAS,MAAM,KAAK,CAAA;AAAA,MACxB,GAAG,GAAG,CAAA;AAAA,IACV,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,KAAK,CAAA;AACzB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEQ,UAAA,CAAW,cAAsB,MAAA,EAA6C;AAClF,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,EAAE,OAAA,EAAS,QAAQ,GAAA,EAAK,KAAA,EAAO,UAAA,EAAY,QAAA,EAAU,CAAA;AAC/E,IAAA,KAAA,MAAW,KAAK,WAAA,EAAa;AACzB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,cAAA,CAAe,CAAA,EAAG,CAAC,CAAA,EAAA,CAAI,CAAA;AACxC,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,MAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,QACrB,KAAA,EAAO,MAAA;AAAA,QACP,MAAA,EAAQ,GAAG,CAAC,CAAA,EAAA,CAAA;AAAA,QACZ,UAAA,EAAY,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAA;AAAA,QAC/B,YAAA,EAAc;AAAA,OACjB,CAAA;AACD,MAAA,GAAA,CAAI,YAAY,GAAG,CAAA;AACnB,MAAA,IAAI,KAAK,KAAA,CAAM,YAAY,MAAM,CAAA,EAAG,IAAA,CAAK,WAAW,GAAG,CAAA;AACvD,MAAA,GAAA,CAAI,gBAAA,CAAiB,OAAA,EAAS,MAAM,MAAA,CAAO,CAAC,CAAC,CAAA;AAC7C,MAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AAAA,IACxB;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEQ,cAAA,CAAe,SAAwC,MAAA,EAAoE;AAC/H,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,EAAE,OAAA,EAAS,QAAQ,GAAA,EAAK,KAAA,EAAO,UAAA,EAAY,QAAA,EAAU,CAAA;AAC/E,IAAA,MAAM,MAAA,GAA+E;AAAA,MACjF,EAAE,KAAK,OAAA,EAAU,GAAA,EAAK,KAAK,OAAA,CAAQ,OAAO,CAAA,EAAI,KAAA,EAAO,OAAA,EAAQ;AAAA,MAC7D,EAAE,KAAK,QAAA,EAAU,GAAA,EAAK,KAAK,OAAA,CAAQ,QAAQ,CAAA,EAAG,KAAA,EAAO,QAAA,EAAS;AAAA,MAC9D,EAAE,KAAK,QAAA,EAAU,GAAA,EAAK,KAAK,OAAA,CAAQ,QAAQ,CAAA,EAAG,KAAA,EAAO,QAAA;AAAS,KAClE;AACA,IAAA,KAAA,MAAW,EAAE,GAAA,EAAK,GAAA,EAAK,KAAA,MAAW,MAAA,EAAQ;AACtC,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AACrC,MAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,MAAA,IAAI,GAAA,KAAQ,OAAA,EAAS,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA;AACxC,MAAA,GAAA,CAAI,gBAAA,CAAiB,OAAA,EAAS,MAAM,MAAA,CAAO,GAAG,CAAC,CAAA;AAC/C,MAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AAAA,IACxB;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEQ,QAAQ,KAAA,EAA8C;AAC1D,IAAA,MAAM,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,KAAA,KAAU,WAAW,OAAA,GAAU,EAAA;AACzE,IAAA,OAAO,CAAA,2FAAA,EAA8F,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAI,+CAA+C,IAAA,GAAO,CAAA,kBAAA,EAAqB,IAAI,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,SAAA,CAAA;AAAA,EACvN;AAAA,EAEQ,YAAA,CAAa,SAAiB,QAAA,EAA+C;AACjF,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,EAAE,OAAA,EAAS,QAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,KAAA,EAAO,CAAA;AAC/E,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC7C,IAAA,MAAA,CAAO,IAAA,GAAO,OAAA;AACd,IAAA,MAAA,CAAO,GAAA,GAAM,GAAA;AACb,IAAA,MAAA,CAAO,GAAA,GAAM,KAAA;AACb,IAAA,MAAA,CAAO,QAAQ,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,GAAG,CAAC,CAAA;AAC/C,IAAA,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,WAAA,EAAa,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,CAAA;AAChF,IAAA,MAAA,CAAO,KAAA,GAAQ,cAAA;AACf,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC3C,IAAA,KAAA,CAAM,WAAA,GAAc,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,CAAA,CAAA;AACnC,IAAA,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,KAAA,EAAO,EAAE,UAAU,MAAA,EAAQ,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,SAAA,EAAW,SAAS,CAAA;AACjH,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,MAAM;AACnC,MAAA,KAAA,CAAM,WAAA,GAAc,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,CAAA,CAAA;AACnC,MAAA,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,GAAI,GAAG,CAAA;AAAA,IACvC,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,KAAK,CAAA;AACzB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEQ,aAAA,CAAc,SAAiB,MAAA,EAAmD;AACtF,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,MAAA,CAAO,OAAO,KAAA,EAAO;AAAA,MACxB,UAAA,EAAY,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,UAAA;AAAA,MAC/B,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAA;AAAA,MAC1B,MAAA,EAAQ,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MAC1C,YAAA,EAAc,KAAA;AAAA,MACd,OAAA,EAAS,SAAA;AAAA,MACT,QAAA,EAAU,MAAA;AAAA,MACV,MAAA,EAAQ,SAAA;AAAA,MACR,MAAA,EAAQ,GAAG,SAAS,CAAA,EAAA,CAAA;AAAA,MACpB,SAAA,EAAW;AAAA,KACd,CAAA;AACD,IAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AACxB,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,MAAA,GAAA,CAAI,KAAA,GAAQ,OAAO,CAAC,CAAA;AACpB,MAAA,GAAA,CAAI,WAAA,GAAc,GAAG,CAAC,CAAA,EAAA,CAAA;AACtB,MAAA,IAAI,CAAA,KAAM,OAAA,EAAS,GAAA,CAAI,QAAA,GAAW,IAAA;AAClC,MAAA,MAAA,CAAO,YAAY,GAAG,CAAA;AAAA,IAC1B;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,MAAM,MAAA,CAAO,OAAO,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AACpE,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEQ,qBAAqB,MAAA,EAA6E;AACtG,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,MAAM,QAAA,GAAW,UAAA;AAEtB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,cAAA,CAAe,kBAAkB,CAAA;AAClD,IAAA,GAAA,CAAI,MAAM,OAAA,GAAU,OAAA;AACpB,IAAA,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,SAAS,CAAA,EAAA,CAAA;AAC/B,IAAA,GAAA,CAAI,MAAM,QAAA,GAAW,MAAA;AACrB,IAAA,GAAA,CAAI,WAAA,GAAc,kBAAA;AAClB,IAAA,IAAA,CAAK,YAAY,GAAG,CAAA;AAEpB,IAAA,GAAA,CAAI,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACjC,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,IAAA,CAAK,iBAAA,GAAoB,CAAC,IAAA,CAAK,iBAAA;AAC/B,MAAA,IAAI,IAAA,CAAK,iBAAA,EAAmB,IAAA,CAAK,YAAA,CAAa,KAAK,MAAM,CAAA;AAAA,gBAC/C,aAAA,EAAc;AAAA,IAC5B,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAA,EAAa,CAAC,CAAA,KAAM;AAC1C,MAAA,IAAI,IAAA,CAAK,QAAA,IAAY,CAAC,IAAA,CAAK,SAAS,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,IAAK,CAAC,IAAA,CAAK,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,EAAG;AAChG,QAAA,IAAA,CAAK,aAAA,EAAc;AACnB,QAAA,IAAA,CAAK,iBAAA,GAAoB,KAAA;AAAA,MAC7B;AAAA,IACJ,CAAC,CAAA;AAED,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEQ,YAAA,CAAa,QAAqB,MAAA,EAAmE;AACzG,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC1C,IAAA,MAAA,CAAO,MAAA,CAAO,MAAM,KAAA,EAAO;AAAA,MACvB,QAAA,EAAU,UAAA;AAAA,MACV,OAAA,EAAS,MAAA;AAAA,MACT,mBAAA,EAAqB,eAAA;AAAA,MACrB,SAAA,EAAW,MAAA;AAAA,MACX,MAAA,EAAQ,KAAA;AAAA,MACR,UAAA,EAAY,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,UAAA;AAAA,MAC/B,MAAA,EAAQ,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MAC1C,YAAA,EAAc,KAAA;AAAA,MACd,OAAA,EAAS,WAAA;AAAA,MACT,MAAA,EAAQ,IAAA;AAAA,MACR,SAAA,EAAW,6BAAA;AAAA,MACX,UAAA,EAAY,gCAAA;AAAA,MACZ,QAAA,EAAU,MAAA;AAAA,MACV,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAA;AAAA,MAC1B,UAAA,EAAY;AAAA,KACf,CAAA;AACD,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,MAAM,EAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,MAAA,CAAO,CAAC,CAAA,GAAI,MAAA,CAAO,CAAC,CAAC,CAAA;AACrE,IAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AAClB,MAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AAEtB,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AACzC,MAAA,EAAA,CAAG,IAAA,GAAO,UAAA;AACV,MAAA,EAAA,CAAG,OAAA,GAAU,MAAM,OAAA,KAAY,KAAA;AAC/B,MAAA,EAAA,CAAG,KAAA,CAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,MAAA;AACrC,MAAA,EAAA,CAAG,MAAM,MAAA,GAAS,SAAA;AAElB,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC3C,MAAA,KAAA,CAAM,WAAA,GAAc,CAAA;AACpB,MAAA,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,CAAA;AAE/E,MAAA,MAAM,SAAS,IAAA,CAAK,eAAA,CAAgB,KAAA,CAAM,KAAA,EAAO,CAAC,GAAA,KAAQ;AACtD,QAAA,IAAA,CAAK,IAAA,CAAK,EAAE,MAAA,EAAQ,EAAE,CAAC,CAAC,GAAG,EAAE,OAAA,EAAS,GAAG,OAAA,EAAS,KAAA,EAAO,GAAA,EAAI,IAAiC,CAAA;AAAA,MAClG,CAAC,CAAA;AAED,MAAA,EAAA,CAAG,gBAAA,CAAiB,UAAU,MAAM;AAChC,QAAA,IAAA,CAAK,KAAK,EAAE,MAAA,EAAQ,EAAE,CAAC,CAAC,GAAG,EAAE,OAAA,EAAS,EAAA,CAAG,SAAS,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM,IAAiC,CAAA;AAAA,MAC1G,CAAC,CAAA;AAED,MAAA,KAAA,CAAM,MAAA,CAAO,EAAA,EAAI,KAAA,EAAO,MAAM,CAAA;AAAA,IAClC;AAEA,IAAA,MAAM,UAAA,GAAa,OAAO,qBAAA,EAAsB;AAChD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,qBAAA,EAAsB;AACnD,IAAA,IAAA,CAAK,SAAA,CAAU,YAAY,KAAK,CAAA;AAChC,IAAA,MAAM,SAAA,GAAY,MAAM,qBAAA,EAAsB;AAC9C,IAAA,IAAI,IAAA,GAAO,UAAA,CAAW,IAAA,GAAO,KAAA,CAAM,IAAA;AACnC,IAAA,IAAI,GAAA,GAAO,UAAA,CAAW,MAAA,GAAS,KAAA,CAAM,GAAA,GAAM,CAAA;AAE3C,IAAA,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,GAAQ,CAAA,EAAG,IAAI,CAAC,CAAA;AACpE,IAAA,IAAI,GAAA,GAAM,SAAA,CAAU,MAAA,GAAS,KAAA,CAAM,SAAS,CAAA,EAAG;AAC3C,MAAA,GAAA,GAAM,IAAA,CAAK,IAAI,CAAA,EAAG,UAAA,CAAW,MAAM,KAAA,CAAM,GAAA,GAAM,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA;AAAA,IACvE;AACA,IAAA,KAAA,CAAM,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA;AAC1B,IAAA,KAAA,CAAM,KAAA,CAAM,GAAA,GAAO,CAAA,EAAG,GAAG,CAAA,EAAA,CAAA;AACzB,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EACpB;AAAA,EAEQ,aAAA,GAAsB;AAC1B,IAAA,IAAA,CAAK,UAAU,MAAA,EAAO;AACtB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,EACpB;AAAA,EAEQ,eAAe,KAAA,EAA+B;AAClD,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,MACrB,OAAA,EAAgB,MAAA;AAAA,MAChB,UAAA,EAAgB,QAAA;AAAA,MAChB,cAAA,EAAgB,QAAA;AAAA,MAChB,QAAA,EAAgB,GAAG,SAAS,CAAA,EAAA,CAAA;AAAA,MAC5B,MAAA,EAAgB,GAAG,SAAS,CAAA,EAAA,CAAA;AAAA,MAC5B,OAAA,EAAgB,OAAA;AAAA,MAChB,YAAA,EAAgB,KAAA;AAAA,MAChB,MAAA,EAAgB,SAAA;AAAA,MAChB,MAAA,EAAgB,CAAA,qBAAA,CAAA;AAAA,MAChB,KAAA,EAAgB,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAA;AAAA,MACnC,UAAA,EAAgB,aAAA;AAAA,MAChB,QAAA,EAAgB,MAAA;AAAA,MAChB,SAAA,EAAgB;AAAA,KACnB,CAAA;AACD,IAAA,GAAA,CAAI,KAAA,GAAQ,KAAA;AACZ,IAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACrC,MAAA,IAAI,GAAA,CAAI,QAAQ,MAAA,KAAW,GAAA,MAAS,KAAA,CAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,gBAAA,CAAiB,eAAA;AAAA,IACvF,CAAC,CAAA;AACD,IAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACrC,MAAA,IAAI,IAAI,OAAA,CAAQ,MAAA,KAAW,GAAA,EAAK,GAAA,CAAI,MAAM,UAAA,GAAa,aAAA;AAAA,IAC3D,CAAC,CAAA;AACD,IAAA,OAAO,GAAA;AAAA,EACX;AAAA,EAEQ,WAAW,GAAA,EAA2B;AAC1C,IAAA,GAAA,CAAI,QAAQ,MAAA,GAAS,GAAA;AACrB,IAAA,GAAA,CAAI,KAAA,CAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,QAAA;AACrC,IAAA,GAAA,CAAI,KAAA,CAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,MAAA;AAAA,EAC1C;AAAA;AAAA,EAIQ,KAAK,KAAA,EAAuC;AAChD,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AAC1B,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,cAAA,CAAe,EAAA,EAAI,KAAK,CAAA;AAC3C,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACjB;AACJ,CAAA;;;AC9jBO,IAAM,iBAAN,MAAqB;AAAA,EAYxB,WAAA,CACI,KAAA,EACA,QAAA,EACA,kBAAA,EACF;AAXF,IAAA,IAAA,CAAQ,IAAA,GAAO,CAAA;AACf,IAAA,IAAA,CAAQ,IAAA,GAAO,GAAA;AACf,IAAA,IAAA,CAAQ,KAAA,GAAQ,CAAA;AAChB,IAAA,IAAA,CAAQ,YAAA,GAAe,CAAA;AACvB,IAAA,IAAA,CAAQ,cAA0B,MAAM;AAAA,IAAC,CAAA;AAqMzC,IAAA,IAAA,CAAQ,cAAA,GAAiB,CAAC,CAAA,KAAwB;AAC9C,MAAA,IAAI,IAAA,CAAK,aAAa,CAAC,IAAA,CAAK,GAAG,QAAA,CAAS,CAAA,CAAE,MAAc,CAAA,EAAG;AACvD,QAAA,IAAA,CAAK,WAAA,EAAY;AACjB,QAAA,IAAA,CAAK,IAAA,EAAK;AAAA,MACd;AAAA,IACJ,CAAA;AAlMI,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,kBAAA,GAAqB,kBAAA;AAE1B,IAAA,IAAA,CAAK,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACtC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO;AAAA,MACzB,QAAA,EAAe,OAAA;AAAA,MACf,OAAA,EAAe,MAAA;AAAA,MACf,aAAA,EAAe,KAAA;AAAA,MACf,UAAA,EAAe,QAAA;AAAA,MACf,GAAA,EAAe,KAAA;AAAA,MACf,UAAA,EAAe,MAAM,OAAA,CAAQ,UAAA;AAAA,MAC7B,MAAA,EAAe,CAAA,UAAA,EAAa,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MAC5C,YAAA,EAAe,KAAA;AAAA,MACf,OAAA,EAAe,SAAA;AAAA,MACf,MAAA,EAAe,IAAA;AAAA,MACf,SAAA,EAAe,4BAAA;AAAA,MACf,UAAA,EAAe,gCAAA;AAAA,MACf,QAAA,EAAe,MAAA;AAAA,MACf,KAAA,EAAe,MAAM,OAAA,CAAQ,IAAA;AAAA,MAC7B,aAAA,EAAe;AAAA,KAClB,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,KAAK,WAAA,CAAY,QAAA,EAAK,MAAM,IAAA,CAAK,IAAA,CAAK,EAAE,CAAC,CAAA;AACxD,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,SAAA,EAAU;AAC5B,IAAA,MAAM,MAAA,GAAS,KAAK,WAAA,CAAY,GAAA,EAAK,MAAM,IAAA,CAAK,IAAA,CAAK,CAAE,CAAC,CAAA;AAExD,IAAA,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,MAAA,EAAQ,IAAA,CAAK,OAAO,MAAM,CAAA;AAGzC,IAAA,IAAA,CAAK,GAAG,gBAAA,CAAiB,WAAA,EAAa,CAAC,CAAA,KAAM,CAAA,CAAE,iBAAiB,CAAA;AAChE,IAAA,IAAA,CAAK,GAAG,gBAAA,CAAiB,YAAA,EAAc,CAAC,CAAA,KAAM,CAAA,CAAE,iBAAiB,CAAA;AAEjE,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAA,EAAa,IAAA,CAAK,cAAc,CAAA;AAE1D,IAAA,IAAA,CAAK,cAAc,eAAA,CAAgB,IAAA,CAAK,EAAA,EAAI,MAAM,KAAK,YAAY,CAAA;AAAA,EACvE;AAAA;AAAA,EAIA,IAAA,CACI,KAAA,EACA,SAAA,EACA,UAAA,EACA,KACA,GAAA,EACI;AACJ,IAAA,MAAM,aAAa,IAAA,CAAK,SAAA;AACxB,IAAA,IAAA,CAAK,IAAA,GAAQ,GAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAQ,GAAA;AACb,IAAA,IAAA,CAAK,KAAA,GAAQ,GAAA;AAEb,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,GAAQ,MAAA,CAAO,GAAG,CAAA;AAC7B,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,GAAQ,MAAA,CAAO,GAAG,CAAA;AAC7B,IAAA,IAAA,CAAK,KAAA,CAAM,IAAA,GAAQ,MAAA,CAAO,GAAG,CAAA;AAC7B,IAAA,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,MAAA,CAAO,UAAU,CAAA;AAEpC,IAAA,IAAA,CAAK,eAAmB,SAAA,GAAY,CAAA;AACpC,IAAA,IAAA,CAAK,EAAA,CAAG,MAAM,OAAA,GAAU,MAAA;AACxB,IAAA,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,IAAA,GAAU,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA;AAChC,IAAA,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,GAAA,GAAU,CAAA,EAAG,KAAK,YAAY,CAAA,EAAA,CAAA;AAE5C,IAAA,IAAI,CAAC,UAAA,EAAY,IAAA,CAAK,kBAAA,IAAqB;AAAA,EAQ/C;AAAA,EAEA,IAAA,GAAa;AACT,IAAA,MAAM,aAAa,IAAA,CAAK,SAAA;AACxB,IAAA,IAAA,CAAK,EAAA,CAAG,MAAM,OAAA,GAAU,MAAA;AACxB,IAAA,IAAI,UAAA,OAAiB,kBAAA,IAAqB;AAAA,EAC9C;AAAA,EAEA,IAAI,SAAA,GAAqB;AACrB,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,OAAA,KAAY,MAAA;AAAA,EACrC;AAAA,EAEA,SAAS,KAAA,EAAyB;AAC9B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO;AAAA,MACzB,UAAA,EAAY,MAAM,OAAA,CAAQ,UAAA;AAAA,MAC1B,MAAA,EAAY,CAAA,UAAA,EAAa,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MACzC,KAAA,EAAY,MAAM,OAAA,CAAQ;AAAA,KAC7B,CAAA;AACD,IAAA,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,YAAA,GAAe,CAAA,UAAA,EAAa,MAAM,UAAU,CAAA,CAAA;AAAA,EACjE;AAAA,EAEA,OAAA,GAAgB;AACZ,IAAA,QAAA,CAAS,mBAAA,CAAoB,WAAA,EAAa,IAAA,CAAK,cAAc,CAAA;AAC7D,IAAA,IAAA,CAAK,WAAA,EAAY;AAAA,EACrB;AAAA;AAAA,EAIQ,WAAA,CAAY,OAAe,OAAA,EAAwC;AACvE,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,IAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,IAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,MACrB,UAAA,EAAc,aAAA;AAAA,MACd,MAAA,EAAc,MAAA;AAAA,MACd,KAAA,EAAc,SAAA;AAAA,MACd,MAAA,EAAc,SAAA;AAAA,MACd,QAAA,EAAc,MAAA;AAAA,MACd,UAAA,EAAc,GAAA;AAAA,MACd,OAAA,EAAc,OAAA;AAAA,MACd,YAAA,EAAc,KAAA;AAAA,MACd,OAAA,EAAc;AAAA,KACjB,CAAA;AACD,IAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AAAE,MAAA,GAAA,CAAI,MAAM,OAAA,GAAU,GAAA;AAAA,IAAK,CAAC,CAAA;AACrE,IAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AAAE,MAAA,GAAA,CAAI,MAAM,OAAA,GAAU,KAAA;AAAA,IAAO,CAAC,CAAA;AACvE,IAAA,GAAA,CAAI,gBAAA,CAAiB,WAAA,EAAa,CAAC,CAAA,KAAM;AACrC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,OAAA,EAAQ;AAAA,IACZ,CAAC,CAAA;AACD,IAAA,OAAO,GAAA;AAAA,EACX;AAAA,EAEQ,SAAA,GAA8B;AAClC,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,IAAA,KAAA,CAAM,IAAA,GAAO,QAAA;AACb,IAAA,MAAA,CAAO,MAAA,CAAO,MAAM,KAAA,EAAO;AAAA,MACvB,KAAA,EAAc,MAAA;AAAA,MACd,UAAA,EAAc,aAAA;AAAA,MACd,MAAA,EAAc,MAAA;AAAA,MACd,YAAA,EAAc,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MAChD,KAAA,EAAc,SAAA;AAAA;AAAA;AAAA;AAAA,MAId,IAAA,EAAc,qCAAA;AAAA,MACd,OAAA,EAAc,MAAA;AAAA,MACd,SAAA,EAAc,QAAA;AAAA,MACd,OAAA,EAAc;AAAA,KACjB,CAAA;AAED,IAAA,KAAA,CAAM,gBAAA,CAAiB,SAAS,MAAM;AAElC,MAAA,KAAA,CAAM,MAAA,EAAO;AAAA,IACjB,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,gBAAA,CAAiB,SAAS,MAAM;AAElC,MAAA,IAAA,CAAK,WAAA,EAAY;AAAA,IACrB,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,gBAAA,CAAiB,SAAA,EAAW,CAAC,CAAA,KAAM;AACrC,MAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACnB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAA,CAAK,WAAA,EAAY;AACjB,QAAA,IAAA,CAAK,IAAA,EAAK;AAAA,MACd,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU;AAC3B,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAA,CAAK,IAAA,EAAK;AAAA,MACd;AAAA,IACJ,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,gBAAA,CAAiB,QAAQ,MAAM;AACjC,MAAA,IAAI,KAAK,SAAA,EAAW;AAChB,QAAA,IAAA,CAAK,WAAA,EAAY;AACjB,QAAA,IAAA,CAAK,IAAA,EAAK;AAAA,MACd;AAAA,IACJ,CAAC,CAAA;AAED,IAAA,OAAO,KAAA;AAAA,EACX;AAAA,EAEQ,KAAK,SAAA,EAAyB;AAClC,IAAA,MAAM,UAAU,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,KAAK,KAAK,IAAA,CAAK,IAAA;AACrD,IAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAA,CAAO,OAAA,GAAU,YAAY,IAAA,CAAK,KAAA,IAAS,IAAI,CAAA,GAAI,IAAA;AACrE,IAAA,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,IAAI,CAAC,CAAC,CAAA;AAKxE,IAAA,IAAA,CAAK,WAAA,EAAY;AAAA,EACrB;AAAA,EAEQ,WAAA,GAAoB;AACxB,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AACvC,IAAA,IAAI,CAAC,MAAM,GAAG,CAAA,IAAK,OAAO,IAAA,CAAK,IAAA,IAAQ,GAAA,IAAO,IAAA,CAAK,IAAA,EAAM;AACrD,MAAA,IAAA,CAAK,SAAS,GAAG,CAAA;AAAA,IACrB;AAAA,EACJ;AAQJ,CAAA;;;ACxNA,IAAM,aAAA,GAAgB,EAAA;AACtB,IAAM,YAAA,GAAgB,EAAA;AAEf,IAAM,kBAAN,MAAsB;AAAA,EAiBzB,WAAA,CACI,KAAA,EACA,QAAA,EACA,kBAAA,EACF;AAXF,IAAA,IAAA,CAAQ,QAAyB,EAAC;AAClC,IAAA,IAAA,CAAQ,aAAA,GAAyB,EAAA;AAEjC,IAAA,IAAA,CAAQ,UAAA,GAAkD,IAAA;AAC1D,IAAA,IAAA,CAAQ,aAAyB,MAAM;AAAA,IAAC,CAAA;AAQpC,IAAA,IAAA,CAAK,KAAA,GAAW,KAAA;AAChB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,kBAAA,GAAqB,kBAAA;AAG1B,IAAA,IAAA,CAAK,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACtC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO;AAAA,MACzB,QAAA,EAAgB,OAAA;AAAA,MAChB,KAAA,EAAgB,GAAA;AAAA,MAChB,UAAA,EAAgB,iBAAA;AAAA,MAChB,OAAA,EAAgB,MAAA;AAAA,MAChB,UAAA,EAAgB,QAAA;AAAA,MAChB,cAAA,EAAgB,QAAA;AAAA,MAChB,MAAA,EAAgB;AAAA,KACnB,CAAA;AACD,IAAA,IAAA,CAAK,EAAA,CAAG,gBAAA,CAAiB,WAAA,EAAa,CAAC,CAAA,KAAM;AACzC,MAAA,IAAI,CAAA,CAAE,MAAA,KAAW,IAAA,CAAK,EAAA,OAAS,IAAA,EAAK;AAAA,IACxC,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACzC,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO;AAAA,MAC5B,OAAA,EAAe,MAAA;AAAA,MACf,aAAA,EAAe,QAAA;AAAA,MACf,KAAA,EAAe,OAAA;AAAA,MACf,SAAA,EAAe,OAAA;AAAA,MACf,UAAA,EAAe,MAAM,OAAA,CAAQ,UAAA;AAAA,MAC7B,MAAA,EAAe,CAAA,UAAA,EAAa,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MAC5C,YAAA,EAAe,KAAA;AAAA,MACf,SAAA,EAAe,6BAAA;AAAA,MACf,UAAA,EAAe,gCAAA;AAAA,MACf,QAAA,EAAe,MAAA;AAAA,MACf,QAAA,EAAe;AAAA,KAClB,CAAA;AACD,IAAA,IAAA,CAAK,MAAM,gBAAA,CAAiB,WAAA,EAAa,CAAC,CAAA,KAAM,CAAA,CAAE,iBAAiB,CAAA;AACnE,IAAA,IAAA,CAAK,EAAA,CAAG,WAAA,CAAY,IAAA,CAAK,KAAK,CAAA;AAG9B,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,IAAA,MAAA,CAAO,MAAA,CAAO,OAAO,KAAA,EAAO;AAAA,MACxB,OAAA,EAAgB,MAAA;AAAA,MAChB,UAAA,EAAgB,QAAA;AAAA,MAChB,cAAA,EAAgB,eAAA;AAAA,MAChB,OAAA,EAAgB,WAAA;AAAA,MAChB,YAAA,EAAgB,CAAA,UAAA,EAAa,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MAC7C,UAAA,EAAgB;AAAA,KACnB,CAAA;AAED,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC7C,IAAA,OAAA,CAAQ,WAAA,GAAc,eAAA;AACtB,IAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,KAAA,EAAO;AAAA,MACzB,KAAA,EAAY,MAAM,OAAA,CAAQ,IAAA;AAAA,MAC1B,UAAA,EAAY,KAAA;AAAA,MACZ,QAAA,EAAY;AAAA,KACf,CAAA;AAED,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC9C,IAAA,QAAA,CAAS,SAAA,GAAY,UAAA;AACrB,IAAA,MAAA,CAAO,MAAA,CAAO,SAAS,KAAA,EAAO;AAAA,MAC1B,OAAA,EAAY,aAAA;AAAA,MACZ,UAAA,EAAY,QAAA;AAAA,MACZ,OAAY,KAAA,CAAM,QAAA;AAAA,MAClB,MAAA,EAAY;AAAA,KACf,CAAA;AACD,IAAA,QAAA,CAAS,gBAAA,CAAiB,cAAc,MAAM;AAAE,MAAA,QAAA,CAAS,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,IAAA;AAAA,IAAM,CAAC,CAAA;AAC5F,IAAA,QAAA,CAAS,gBAAA,CAAiB,cAAc,MAAM;AAAE,MAAA,QAAA,CAAS,KAAA,CAAM,QAAQ,KAAA,CAAM,QAAA;AAAA,IAAU,CAAC,CAAA;AACxF,IAAA,QAAA,CAAS,gBAAA,CAAiB,OAAA,EAAS,MAAM,IAAA,CAAK,MAAM,CAAA;AAEpD,IAAA,MAAA,CAAO,YAAY,OAAO,CAAA;AAC1B,IAAA,MAAA,CAAO,YAAY,QAAQ,CAAA;AAC3B,IAAA,IAAA,CAAK,KAAA,CAAM,YAAY,MAAM,CAAA;AAG7B,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC/C,IAAA,MAAA,CAAO,MAAA,CAAO,WAAW,KAAA,EAAO;AAAA,MAC5B,OAAA,EAAc,UAAA;AAAA,MACd,YAAA,EAAc,CAAA,UAAA,EAAa,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MAC3C,UAAA,EAAc;AAAA,KACjB,CAAA;AAED,IAAA,IAAA,CAAK,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AACjD,IAAA,IAAA,CAAK,YAAY,IAAA,GAAc,MAAA;AAC/B,IAAA,IAAA,CAAK,YAAY,WAAA,GAAc,sBAAA;AAC/B,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO;AAAA,MAClC,KAAA,EAAiB,MAAA;AAAA,MACjB,SAAA,EAAiB,YAAA;AAAA,MACjB,UAAA,EAAiB,aAAA;AAAA,MACjB,MAAA,EAAiB,CAAA,UAAA,EAAa,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MAC9C,YAAA,EAAiB,KAAA;AAAA,MACjB,KAAA,EAAiB,MAAM,OAAA,CAAQ,IAAA;AAAA;AAAA;AAAA,MAG/B,QAAA,EAAiB,MAAA;AAAA,MACjB,OAAA,EAAiB,SAAA;AAAA,MACjB,OAAA,EAAiB;AAAA,KACpB,CAAA;AACD,IAAA,IAAA,CAAK,YAAY,gBAAA,CAAiB,OAAA,EAAS,MAAM,IAAA,CAAK,YAAY,CAAA;AAElE,IAAA,UAAA,CAAW,WAAA,CAAY,KAAK,WAAW,CAAA;AACvC,IAAA,IAAA,CAAK,KAAA,CAAM,YAAY,UAAU,CAAA;AAGjC,IAAA,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC1C,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO;AAAA,MAC7B,SAAA,EAAiB,MAAA;AAAA,MACjB,IAAA,EAAiB,GAAA;AAAA,MACjB,cAAA,EAAiB,MAAA;AAAA,MACjB,cAAA,EAAiB;AAAA,KACpB,CAAA;AACD,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA;AAElC,IAAA,IAAA,CAAK,UAAA,GAAa,wBAAA,CAAyB,IAAA,CAAK,KAAK,CAAA;AAAA,EACzD;AAAA;AAAA,EAIA,IAAA,CAAK,OAAiB,aAAA,EAA6B;AAC/C,IAAA,MAAM,aAAa,IAAA,CAAK,SAAA;AACxB,IAAA,IAAA,CAAK,KAAA,GAAgB,KAAA;AACrB,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AACrB,IAAA,IAAA,CAAK,YAAY,KAAA,GAAQ,EAAA;AACzB,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,IAAA,CAAK,EAAA,CAAG,MAAM,OAAA,GAAU,MAAA;AAExB,IAAA,qBAAA,CAAsB,MAAM,KAAK,WAAA,CAAY,KAAA,CAAM,EAAE,aAAA,EAAe,IAAA,EAAM,CAAC,CAAA;AAG3E,IAAA,IAAA,CAAK,UAAA,GAAa,CAAC,CAAA,KAAqB;AACpC,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,IAAA,CAAK,IAAA,EAAK;AAAA,IACtC,CAAA;AACA,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,EAAW,IAAA,CAAK,UAAU,CAAA;AACpD,IAAA,IAAI,CAAC,UAAA,EAAY,IAAA,CAAK,kBAAA,IAAqB;AAAA,EAC/C;AAAA,EAEA,IAAA,GAAa;AACT,IAAA,MAAM,aAAa,IAAA,CAAK,SAAA;AACxB,IAAA,IAAA,CAAK,EAAA,CAAG,MAAM,OAAA,GAAU,MAAA;AACxB,IAAA,IAAI,KAAK,UAAA,EAAY;AACjB,MAAA,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,IAAA,CAAK,UAAU,CAAA;AACvD,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IACtB;AACA,IAAA,IAAI,UAAA,OAAiB,kBAAA,IAAqB;AAAA,EAC9C;AAAA,EAEA,IAAI,SAAA,GAAqB;AACrB,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,OAAA,KAAY,MAAA;AAAA,EACrC;AAAA,EAEA,iBAAiB,MAAA,EAAsB;AACnC,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAA;AAErB,IAAA,IAAI,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,OAAA,KAAY,MAAA,EAAQ;AAClC,MAAA,IAAA,CAAK,UAAA,EAAW;AAAA,IACpB;AAAA,EACJ;AAAA,EAEA,SAAS,KAAA,EAAuB;AAC5B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACjB;AAAA,EAEA,SAAS,KAAA,EAAyB;AAC9B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO;AAAA,MAC5B,UAAA,EAAY,MAAM,OAAA,CAAQ,UAAA;AAAA,MAC1B,MAAA,EAAY,CAAA,UAAA,EAAa,KAAA,CAAM,UAAU,CAAA;AAAA,KAC5C,CAAA;AAAA,EACL;AAAA,EAEA,OAAA,GAAgB;AACZ,IAAA,IAAI,KAAK,UAAA,EAAY,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,KAAK,UAAU,CAAA;AAC5E,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,IAAA,CAAK,GAAG,MAAA,EAAO;AAAA,EACnB;AAAA;AAAA,EAIQ,qBAAqB,KAAA,EAA2B;AACpD,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,EAAe,OAAO,KAAA;AAChC,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,aAAa,CAAA;AAC5C,IAAA,IAAI,GAAA,IAAO,GAAG,OAAO,KAAA;AACrB,IAAA,MAAM,MAAA,GAAS,MAAM,KAAA,EAAM;AAC3B,IAAA,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AACpB,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,aAAa,CAAA;AACjC,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEQ,UAAA,GAAmB;AACvB,IAAA,MAAM,QAAU,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,IAAA,GAAO,WAAA,EAAY;AAC1D,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,oBAAA,CAAqB,KAAA,GACrC,IAAA,CAAK,MAAM,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,EAAY,CAAE,QAAA,CAAS,KAAK,CAAC,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,YAAY,CAAA,GAC7E,KAAK,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,aAAa,CAAC,CAAA;AAExC,IAAA,IAAA,CAAK,OAAO,SAAA,GAAY,EAAA;AAExB,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACvB,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC1C,MAAA,KAAA,CAAM,WAAA,GAAc,kBAAA;AACpB,MAAA,MAAA,CAAO,MAAA,CAAO,MAAM,KAAA,EAAO;AAAA,QACvB,OAAA,EAAW,WAAA;AAAA,QACX,KAAA,EAAW,KAAK,KAAA,CAAM,QAAA;AAAA,QACtB,SAAA,EAAW;AAAA,OACd,CAAA;AACD,MAAA,IAAA,CAAK,MAAA,CAAO,YAAY,KAAK,CAAA;AAC7B,MAAA;AAAA,IACJ;AAEA,IAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AACzB,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,MAAA,MAAM,QAAA,GAAW,SAAS,IAAA,CAAK,aAAA;AAC/B,MAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,QACrB,OAAA,EAAiB,UAAA;AAAA,QACjB,MAAA,EAAiB,SAAA;AAAA,QACjB,KAAA,EAAiB,WAAW,IAAA,CAAK,KAAA,CAAM,GAAG,UAAA,GAAa,IAAA,CAAK,MAAM,OAAA,CAAQ,IAAA;AAAA,QAC1E,UAAA,EAAiB,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAG,QAAA,GAAa,aAAA;AAAA,QACvD,UAAA,EAAiB,WAAW,KAAA,GAAQ,KAAA;AAAA,QACpC,YAAiB,QAAA,GAAW,CAAA,UAAA,EAAa,KAAK,KAAA,CAAM,EAAA,CAAG,MAAM,CAAA,CAAA,GAAK,uBAAA;AAAA,QAClE,SAAA,EAAiB,YAAA;AAAA,QACjB,UAAA,EAAiB;AAAA,OACpB,CAAA;AAED,MAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAElB,MAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACrC,QAAA,IAAI,IAAA,KAAS,KAAK,aAAA,EAAe;AAC7B,UAAA,GAAA,CAAI,KAAA,CAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,QAAA;AAAA,QACzC;AAAA,MACJ,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,gBAAA,CAAiB,cAAc,MAAM;AACrC,QAAA,IAAI,IAAA,KAAS,KAAK,aAAA,EAAe;AAC7B,UAAA,GAAA,CAAI,MAAM,UAAA,GAAa,aAAA;AAAA,QAC3B;AAAA,MACJ,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,gBAAA,CAAiB,SAAS,MAAM;AAChC,QAAA,IAAA,CAAK,SAAS,IAAI,CAAA;AAClB,QAAA,IAAA,CAAK,IAAA,EAAK;AAAA,MACd,CAAC,CAAA;AAED,MAAA,IAAA,CAAK,MAAA,CAAO,YAAY,GAAG,CAAA;AAAA,IAC/B;AAAA,EACJ;AACJ,CAAA;;;AC9PO,IAAM,gBAAA,GAAN,MAAM,iBAAA,CAAiB;AAAA,EAAvB,WAAA,GAAA;AACH,IAAA,IAAA,CAAQ,OAAA,GAAoB,KAAA;AAC5B,IAAA,IAAA,CAAQ,kBAAA,GAAqB,KAAA;AAG7B;AAAA,IAAA,IAAA,CAAQ,MAAA,GAAiC,IAAA;AACzC,IAAA,IAAA,CAAQ,WAAA,GAAwB,CAAA;AAChC,IAAA,IAAA,CAAQ,aAAA,GAAwB,CAAA;AAMhC;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,YAAA,GAAwB,CAAA;AAEhC;AAAA,IAAA,IAAA,CAAQ,aAAA,GAAwB,CAAA,QAAA;AAChC,IAAA,IAAA,CAAQ,aAAA,GAAwB,QAAA;AAGhC;AAAA,IAAA,IAAA,CAAQ,YAAA,GAAyD,IAAA;AACjE,IAAA,IAAA,CAAQ,kBAAA,GAA+B,CAAA;AACvC,IAAA,IAAA,CAAQ,oBAAA,GAA+B,CAAA;AACvC,IAAA,IAAA,CAAQ,mBAAA,GAA+B,CAAA;AAGvC;AAAA,IAAA,IAAA,CAAQ,mBAAA,GAAgC,CAAA;AACxC,IAAA,IAAA,CAAQ,kBAAA,GAAwC,KAAA;AAChD,IAAA,IAAA,CAAQ,mBAAA,GAAgC,CAAA;AAIxC;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,eAAA,GAA4B,KAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAapC,SAAA,CACI,KAAA,EACA,MAAA,EACA,WAAA,EACA,UAAA,EACA,SACA,OAAA,EACA,IAAA,EACA,WAAA,EACA,SAAA,EACA,cAAA,EACI;AACJ,IAAA,IAAA,CAAK,OAAA,GAAqB,IAAA;AAC1B,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAA;AAC1B,IAAA,IAAA,CAAK,MAAA,GAAqB,KAAA;AAC1B,IAAA,IAAA,CAAK,eAAqB,MAAA,GAAS,WAAA;AACnC,IAAA,IAAA,CAAK,WAAA,GAAqB,UAAA;AAC1B,IAAA,IAAA,CAAK,aAAA,GAAqB,UAAA;AAC1B,IAAA,IAAA,CAAK,YAAA,GAAqB,IAAA;AAE1B,IAAA,IAAA,CAAK,kBAAqB,cAAA,KAAmB,IAAA;AAC7C,IAAA,IAAA,CAAK,aAAA,GAAqB,OAAA;AAC1B,IAAA,IAAA,CAAK,aAAA,GAAqB,OAAA;AAC1B,IAAA,IAAA,CAAK,eAAA,GAAqB,OAAA;AAC1B,IAAA,IAAA,CAAK,eAAA,GAAqB,OAAA;AAE1B,IAAA,IAAI,KAAK,eAAA,EAAiB;AAEtB,MAAA,IAAA,CAAK,aAAA,GAAgB,CAAA,QAAA;AACrB,MAAA,IAAA,CAAK,aAAA,GAAgB,QAAA;AAAA,IACzB,CAAA,MAAA,IAAW,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,MAAA,EAAW;AAEvD,MAAA,MAAM,IAAI,IAAA,IAAQ,KAAA;AAClB,MAAA,IAAI,MAAM,KAAA,EAAO;AACb,QAAA,IAAA,CAAK,gBAAgB,OAAA,IAAY,CAAA,QAAA;AACjC,QAAA,IAAA,CAAK,gBAAgB,OAAA,IAAY,QAAA;AAAA,MACrC,CAAA,MAAO;AACH,QAAA,IAAA,CAAK,gBAAgB,OAAA,IAAY,CAAA,QAAA;AACjC,QAAA,IAAA,CAAK,gBAAgB,OAAA,IAAY,QAAA;AAAA,MACrC;AAAA,IACJ,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,aAAA,GAAgB,CAAA,QAAA;AACrB,MAAA,IAAA,CAAK,aAAA,GAAgB,QAAA;AAAA,IACzB;AAGA,IAAA,IAAI,eAAe,WAAA,GAAc,CAAA,IAAK,SAAA,IAAa,SAAA,KAAc,YAAY,IAAA,EAAM;AAC/E,MAAA,MAAM,oBACD,IAAA,KAAS,KAAA,IAAU,cAAc,OAAA,IACjC,IAAA,KAAS,UAAU,SAAA,KAAc,MAAA;AACtC,MAAA,IAAI,iBAAA,EAAmB;AACnB,QAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,eAAe,WAAW,CAAA;AAAA,MACjE,CAAA,MAAO;AACH,QAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,eAAe,WAAW,CAAA;AAAA,MACjE;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,gBAAA,CACI,aACA,WAAA,EACA,UAAA,EACA,QACA,aAAA,EACA,kBAAA,GAA8B,GAC9B,mBAAA,EACI;AACJ,IAAA,IAAA,CAAK,OAAA,GAAwB,IAAA;AAC7B,IAAA,IAAA,CAAK,kBAAA,GAAwB,IAAA;AAC7B,IAAA,IAAA,CAAK,MAAA,GAAwB,WAAA;AAC7B,IAAA,IAAA,CAAK,YAAA,GAAwB,WAAA;AAC7B,IAAA,IAAA,CAAK,kBAAA,GAAwB,UAAA;AAC7B,IAAA,IAAA,CAAK,oBAAA,GAAwB,UAAA;AAC7B,IAAA,IAAA,CAAK,sBAAwB,MAAA,GAAS,aAAA;AACtC,IAAA,IAAA,CAAK,mBAAA,GAAwB,uBAAuB,WAAA,CAAY,KAAA;AAChE,IAAA,IAAA,CAAK,kBAAA,GAAyB,YAA0C,IAAA,IAAQ,KAAA;AAChF,IAAA,IAAA,CAAK,mBAAA,GAAwB,kBAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAA,CACI,QAAA,EACA,KAAA,EACA,UAAA,EACA,MAAA,EAOK;AACL,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,CAAC,IAAA,CAAK,QAAQ,OAAO,IAAA;AAE1C,IAAA,IAAI,IAAA,CAAK,kBAAA,IAAsB,IAAA,CAAK,YAAA,KAAiB,IAAA,EAAM;AACvD,MAAA,MAAMU,WAAAA,GAAa,WAAW,IAAA,CAAK,mBAAA;AACnC,MAAA,MAAMC,SAAAA,GAAW,KAAA,CAAM,YAAA,CAAaD,WAAAA,EAAY,YAAY,MAAM,CAAA;AAClE,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,kBAAA,CAAmBC,SAAAA,EAAU,IAAA,CAAK,YAAA,EAAc,IAAA,CAAK,mBAAA,EAAqB,IAAA,CAAK,kBAAA,EAAoB,IAAA,CAAK,mBAAmB,CAAA;AACrJ,MAAA,IAAA,CAAK,oBAAA,GAAuB,YAAA;AAC5B,MAAA,OAAO;AAAA,QACH,QAAA,EAAW,YAAA;AAAA,QACX,OAAW,CAAA,EAAG,IAAA,CAAK,OAAO,KAAK,CAAA,CAAA,EAAI,KAAK,YAAY,CAAA,CAAA;AAAA,QACpD,SAAA,EAAW;AAAA,OACf;AAAA,IACJ;AAEA,IAAA,MAAM,UAAA,GAAa,WAAW,IAAA,CAAK,YAAA;AACnC,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,YAAA,CAAa,UAAA,EAAY,YAAY,MAAM,CAAA;AAElE,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,aAAA,EAAe,KAAK,GAAA,CAAI,IAAA,CAAK,aAAA,EAAe,QAAQ,CAAC,CAAA;AACvF,IAAA,IAAA,CAAK,aAAA,GAAgB,WAAA;AAErB,IAAA,IAAI,KAAK,eAAA,EAAiB;AACtB,MAAA,MAAM,KAAA,GAAQ,cAAc,IAAA,CAAK,WAAA;AACjC,MAAA,IAAA,CAAK,kBAAkB,IAAA,CAAK,aAAA,KAAkB,MAAA,GAAY,IAAA,CAAK,gBAAgB,KAAA,GAAQ,MAAA;AACvF,MAAA,IAAA,CAAK,kBAAkB,IAAA,CAAK,aAAA,KAAkB,MAAA,GAAY,IAAA,CAAK,gBAAgB,KAAA,GAAQ,MAAA;AACvF,MAAA,OAAO;AAAA,QACH,QAAA,EAAgB,WAAA;AAAA,QAChB,KAAA,EAAgB,KAAK,MAAA,CAAO,KAAA;AAAA,QAC5B,SAAA,EAAgB,KAAA;AAAA,QAChB,gBAAgB,IAAA,CAAK,eAAA;AAAA,QACrB,gBAAgB,IAAA,CAAK;AAAA,OACzB;AAAA,IACJ;AAEA,IAAA,OAAO;AAAA,MACH,QAAA,EAAW,WAAA;AAAA,MACX,KAAA,EAAW,KAAK,MAAA,CAAO,KAAA;AAAA,MACvB,SAAA,EAAW;AAAA,KACf;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAA,GAgBS;AACL,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,CAAC,IAAA,CAAK,QAAQ,OAAO,IAAA;AAE1C,IAAA,MAAM,QAAQ,IAAA,CAAK,MAAA;AACnB,IAAA,IAAI,MAAA;AAEJ,IAAA,IAAI,IAAA,CAAK,kBAAA,IAAsB,IAAA,CAAK,YAAA,KAAiB,IAAA,EAAM;AACvD,MAAA,MAAA,GAAS;AAAA,QACL,OAAa,KAAA,CAAM,KAAA;AAAA,QACnB,MAAa,KAAA,CAAM,IAAA;AAAA,QACnB,UAAa,IAAA,CAAK,oBAAA;AAAA,QAClB,YAAa,IAAA,CAAK,kBAAA;AAAA,QAClB,MAAa,KAAA,CAAM,IAAA;AAAA,QACnB,aAAa,IAAA,CAAK;AAAA,OACtB;AAAA,IACJ,CAAA,MAAA,IAAW,KAAK,eAAA,EAAiB;AAC7B,MAAA,MAAA,GAAS;AAAA,QACL,OAAgB,KAAA,CAAM,KAAA;AAAA,QACtB,MAAgB,KAAA,CAAM,IAAA;AAAA,QACtB,UAAgB,IAAA,CAAK,aAAA;AAAA,QACrB,YAAgB,IAAA,CAAK,WAAA;AAAA,QACrB,MAAgB,KAAA,CAAM,IAAA;AAAA,QACtB,gBAAgB,IAAA,CAAK,eAAA;AAAA,QACrB,gBAAgB,IAAA,CAAK,eAAA;AAAA,QACrB,cAAgB,IAAA,CAAK,aAAA;AAAA,QACrB,cAAgB,IAAA,CAAK;AAAA,OACzB;AAAA,IACJ,CAAA,MAAO;AACH,MAAA,MAAA,GAAS;AAAA,QACL,OAAY,KAAA,CAAM,KAAA;AAAA,QAClB,MAAY,KAAA,CAAM,IAAA;AAAA,QAClB,UAAY,IAAA,CAAK,aAAA;AAAA,QACjB,YAAY,IAAA,CAAK,WAAA;AAAA,QACjB,MAAY,KAAA,CAAM;AAAA,OACtB;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,MAAA,EAAO;AACZ,IAAA,OAAO,MAAA;AAAA,EACX;AAAA;AAAA,EAGA,UAAA,GAAmB;AACf,IAAA,IAAA,CAAK,MAAA,EAAO;AAAA,EAChB;AAAA,EAEA,IAAI,MAAA,GAAkB;AAClB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EAChB;AAAA;AAAA,EAGA,IAAI,SAAA,GAA2B;AAC3B,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,CAAC,IAAA,CAAK,QAAQ,OAAO,IAAA;AAC1C,IAAA,IAAI,IAAA,CAAK,kBAAA,IAAsB,IAAA,CAAK,YAAA,EAAc;AAC9C,MAAA,OAAO,GAAG,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,KAAK,YAAY,CAAA,CAAA;AAAA,IACpD;AACA,IAAA,OAAO,KAAK,MAAA,CAAO,KAAA;AAAA,EACvB;AAAA;AAAA,EAGA,IAAI,YAAA,GAA8B;AAC9B,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,OAAO,IAAA;AAC1B,IAAA,OAAO,IAAA,CAAK,kBAAA,GACN,IAAA,CAAK,oBAAA,GACL,IAAA,CAAK,aAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,OAAO,mBAAA,CACH,KAAA,EACA,aACA,WAAA,EACA,UAAA,EACA,qBAA8B,CAAA,EACvB;AACP,IAAA,MAAM,GAAA,GAAM,kBAAA,GAAqB,CAAA,GAC1B,UAAA,KAAe,KAAA,GACX,WAAA,KAAgB,UAAA,GACb,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,kBAAkB,CAAA,GACxC,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,kBAAkB,CAAA,GAC3C,WAAA,KAAgB,UAAA,GACb,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,kBAAkB,CAAA,GACxC,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,kBAAkB,CAAA,GAChD,WAAA;AAEN,IAAA,IAAI,eAAe,KAAA,EAAO;AACtB,MAAA,OAAO,WAAA,KAAgB,UAAA,GAAa,KAAA,GAAQ,GAAA,GAAM,KAAA,GAAQ,GAAA;AAAA,IAC9D;AACA,IAAA,OAAO,WAAA,KAAgB,UAAA,GAAa,KAAA,GAAQ,GAAA,GAAM,KAAA,GAAQ,GAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,mBACJ,QAAA,EACA,WAAA,EACA,WAAA,EACA,UAAA,EACA,qBAA6B,CAAA,EACvB;AACN,IAAA,IAAI,kBAAiB,mBAAA,CAAoB,QAAA,EAAU,aAAa,WAAA,EAAa,UAAA,EAAY,kBAAkB,CAAA,EAAG;AAC1G,MAAA,OAAO,QAAA;AAAA,IACX;AAEA,IAAA,IAAI,qBAAqB,CAAA,EAAG;AACxB,MAAA,OAAO,UAAA,KAAe,KAAA,GACf,WAAA,KAAgB,UAAA,GACb,IAAA,CAAK,IAAI,WAAA,EAAa,kBAAkB,CAAA,GACxC,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,kBAAkB,CAAA,GAC3C,WAAA,KAAgB,UAAA,GACb,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,kBAAkB,CAAA,GACxC,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,kBAAkB,CAAA;AAAA,IACtD;AACA,IAAA,OAAO,WAAA;AAAA,EACX;AAAA,EAEQ,MAAA,GAAe;AACnB,IAAA,IAAA,CAAK,OAAA,GAAuB,KAAA;AAC5B,IAAA,IAAA,CAAK,kBAAA,GAAuB,KAAA;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAuB,IAAA;AAC5B,IAAA,IAAA,CAAK,YAAA,GAAuB,IAAA;AAC5B,IAAA,IAAA,CAAK,aAAA,GAAuB,CAAA;AAC5B,IAAA,IAAA,CAAK,YAAA,GAAuB,CAAA;AAC5B,IAAA,IAAA,CAAK,aAAA,GAAuB,CAAA,QAAA;AAC5B,IAAA,IAAA,CAAK,aAAA,GAAuB,QAAA;AAC5B,IAAA,IAAA,CAAK,kBAAA,GAAuB,CAAA;AAC5B,IAAA,IAAA,CAAK,oBAAA,GAAuB,CAAA;AAC5B,IAAA,IAAA,CAAK,mBAAA,GAAuB,CAAA;AAC5B,IAAA,IAAA,CAAK,mBAAA,GAAuB,CAAA;AAC5B,IAAA,IAAA,CAAK,kBAAA,GAAwB,KAAA;AAC7B,IAAA,IAAA,CAAK,mBAAA,GAAwB,CAAA;AAC7B,IAAA,IAAA,CAAK,eAAA,GAAwB,KAAA;AAC7B,IAAA,IAAA,CAAK,aAAA,GAAwB,MAAA;AAC7B,IAAA,IAAA,CAAK,aAAA,GAAwB,MAAA;AAC7B,IAAA,IAAA,CAAK,eAAA,GAAwB,MAAA;AAC7B,IAAA,IAAA,CAAK,eAAA,GAAwB,MAAA;AAAA,EACjC;AACJ,CAAA;;;AClXO,SAAS,SAAA,CAAU,KAAe,MAAA,EAA6B;AAClE,EAAA,OAAO,IAAI,MAAM,CAAA;AACrB;;;ACFO,IAAM,MAAN,MAAgC;AAAA,EAIrC,YACmB,MAAA,EACjB,KAAA,GAAQ,WACR,IAAA,GAAO,IAAA,EACU,SAAsB,OAAA,EACvC;AAJiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAGA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAEjB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,QAAQ,IAAA,EAAqC;AAC3C,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AACxB,MAAA,IAAI,CAAA,GAAI,KAAK,MAAA,GAAS,CAAA,SAAU,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,IAAA,EAAK;AACxD,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,GAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK,GAAA,IAAO,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,EAAG,KAAK,MAAM,CAAA;AACpF,MAAA,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,GAAA,GAAM,KAAK,MAAA,EAAO;AAAA,IAC9C,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAA,CACE,GAAA,EACA,OAAA,EACA,KAAA,EACA,UACA,WAAA,EACM;AACN,IAAA,MAAM,UAAA,GAAa,qBAAqB,GAAG,CAAA;AAC3C,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,cAAc,IAAA,CAAK,KAAA;AACvB,IAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AAEf,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,MAAM,UAAA,GAAc,GAAA,CAAI,MAAA,CAAwD,WAAA,IAAe,IAAI,MAAA,CAAO,KAAA;AAE1G,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAA,CAAE,UAAU,IAAA,EAAM;AAAE,QAAA,OAAA,GAAU,KAAA;AAAO,QAAA;AAAA,MAAU;AACnD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,WAAW,CAAA;AACzD,MAAA,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,OAAA,GAAU,IAAA,CAAA;AAAA,IAC7D;AAEA,IAAA,GAAA,CAAI,MAAA,EAAO;AAAA,EACb;AACF;AAGA,SAAS,qBAAqB,GAAA,EAA+B;AAC3D,EAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,EAAA,OAAO,OAAO,WAAA,IAAe,IAAA;AAC/B;;;ACxDO,IAAM,MAAN,MAAgC;AAAA,EAIrC,YACmB,MAAA,EACjB,KAAA,GAAQ,WACR,IAAA,GAAO,KAAA,EACU,SAAsB,OAAA,EACvC;AAJiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAGA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAEjB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,QAAQ,IAAA,EAAqC;AAC3C,IAAA,MAAM,CAAA,GAAI,CAAA,IAAK,IAAA,CAAK,MAAA,GAAS,CAAA,CAAA;AAC7B,IAAA,MAAM,UAA6B,EAAC;AACpC,IAAA,IAAI,GAAA,GAAqB,IAAA;AAEzB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,IAAI,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AACvB,QAAA,OAAA,CAAQ,KAAK,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACtC,QAAA;AAAA,MACF;AACA,MAAA,IAAI,QAAQ,IAAA,EAAM;AAEhB,QAAA,IAAI,GAAA,GAAM,CAAA;AACV,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,CAAA,EAAA,EAAK,GAAA,IAAO,SAAA,CAAU,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,EAAG,KAAK,MAAM,CAAA;AAC/E,QAAA,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA;AAAA,MACnB,CAAA,MAAO;AACL,QAAA,GAAA,GAAM,SAAA,CAAU,KAAK,CAAC,CAAA,EAAG,KAAK,MAAM,CAAA,GAAI,CAAA,GAAI,GAAA,IAAO,CAAA,GAAI,CAAA,CAAA;AAAA,MACzD;AACA,MAAA,OAAA,CAAQ,KAAK,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,KAAK,CAAA;AAAA,IACvC;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAA,CACE,GAAA,EACA,OAAA,EACA,KAAA,EACA,UACA,WAAA,EACM;AACN,IAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,IAAA,MAAM,aAAa,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,cAAc,IAAA,CAAK,KAAA;AACvB,IAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AAEf,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,MAAM,UAAA,GAAc,GAAA,CAAI,MAAA,CAAwD,WAAA,IAAe,IAAI,MAAA,CAAO,KAAA;AAE1G,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAA,CAAE,UAAU,IAAA,EAAM;AAAE,QAAA,OAAA,GAAU,KAAA;AAAO,QAAA;AAAA,MAAU;AACnD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,WAAW,CAAA;AACzD,MAAA,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,OAAA,GAAU,IAAA,CAAA;AAAA,IAC7D;AAEA,IAAA,GAAA,CAAI,MAAA,EAAO;AAAA,EACb;AACF;;;AClEO,IAAM,MAAN,MAAgC;AAAA,EAIrC,WAAA,CACmB,SAAS,EAAA,EAC1B,KAAA,GAAQ,WACR,IAAA,GAAO,KAAA,EACU,SAAsB,OAAA,EACvC;AAJiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAGA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAEjB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,QAAQ,IAAA,EAAqC;AAC3C,IAAA,MAAM,WAAA,GAAe,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,SAAS,CAAA,CAAA,GAAM,CAAA;AACxD,IAAA,MAAM,UAA6B,EAAC;AAEpC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,IAAI,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AACvB,QAAA,OAAA,CAAQ,KAAK,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACtC,QAAA;AAAA,MACF;AACA,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAEpC,QAAA,GAAA,IAAO,SAAA,CAAU,IAAA,CAAK,CAAA,IAAK,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,IAAK,CAAA,GAAI,CAAA,CAAA;AAAA,MACxE;AACA,MAAA,OAAA,CAAQ,KAAK,EAAE,KAAA,EAAO,GAAG,KAAA,EAAO,GAAA,GAAM,aAAa,CAAA;AAAA,IACrD;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAA,CACE,GAAA,EACA,OAAA,EACA,KAAA,EACA,UACA,WAAA,EACM;AACN,IAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,IAAA,MAAM,aAAa,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,MAAM,UAAA,GAAc,MAAA,CAAwD,WAAA,IAAe,GAAA,CAAI,MAAA,CAAO,KAAA;AAEtG,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,cAAc,IAAA,CAAK,KAAA;AACvB,IAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AAEf,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAA,CAAE,UAAU,IAAA,EAAM;AAAE,QAAA,OAAA,GAAU,KAAA;AAAO,QAAA;AAAA,MAAU;AACnD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,WAAW,CAAA;AACzD,MAAA,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,OAAA,GAAU,IAAA,CAAA;AAAA,IAC7D;AAEA,IAAA,GAAA,CAAI,MAAA,EAAO;AAAA,EACb;AACF,CAAA;;;AC9DA,SAAS,UAAA,CAAW,MAAgB,MAAA,EAAmC;AACrE,EAAA,MAAM,WAAA,GAAe,MAAA,IAAU,MAAA,GAAS,CAAA,CAAA,GAAM,CAAA;AAC9C,EAAA,MAAM,UAA6B,EAAC;AAEpC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,IAAI,CAAA,GAAI,SAAS,CAAA,EAAG;AAClB,MAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AACjB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAE/B,MAAA,GAAA,IAAO,KAAK,CAAA,IAAK,MAAA,GAAS,CAAA,GAAI,CAAA,CAAE,KAAK,CAAA,GAAI,CAAA,CAAA;AAAA,IAC3C;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,WAAW,CAAA;AAAA,EAChC;AAEA,EAAA,OAAO,OAAA;AACT;AAEO,IAAM,MAAN,MAAgC;AAAA,EAIrC,WAAA,CACmB,SAAS,EAAA,EAC1B,KAAA,GAAQ,WACR,IAAA,GAAO,KAAA,EACU,SAAsB,OAAA,EACvC;AAJiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAGA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAEjB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,QAAQ,IAAA,EAAqC;AAC3C,IAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,CAAC,MAAM,SAAA,CAAU,CAAA,EAAG,IAAA,CAAK,MAAM,CAAC,CAAA;AACxD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAS,CAAC,CAAA;AAC7C,IAAA,MAAM,aAAa,IAAA,CAAK,KAAA,CAAM,KAAK,IAAA,CAAK,IAAA,CAAK,MAAM,CAAC,CAAA;AAGpD,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,MAAA,EAAQ,UAAU,CAAA;AAC7C,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,MAAA,EAAQ,IAAA,CAAK,MAAM,CAAA;AAG9C,IAAA,MAAM,IAAA,GAA0B,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAM,CAAA,KAAM;AACvD,MAAA,MAAM,IAAA,GAAO,QAAQ,CAAC,CAAA;AACtB,MAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,IAAA,EAAM,OAAO,IAAA;AAC3C,MAAA,OAAO,IAAI,IAAA,GAAO,IAAA;AAAA,IACpB,CAAC,CAAA;AAID,IAAA,MAAM,UAAA,GAAa,KAAK,GAAA,CAAI,CAAC,MAAO,CAAA,KAAM,IAAA,GAAO,IAAI,CAAE,CAAA;AACvD,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,UAAA,EAAY,UAAU,CAAA;AAEhD,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AAExB,MAAA,MAAM,WAAA,GAAc,IAAI,UAAA,GAAa,CAAA;AACrC,MAAA,IAAI,cAAc,CAAA,EAAG,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,OAAO,IAAA,EAAK;AAEpD,MAAA,MAAM,eAAe,IAAA,CAAK,WAAW,MAAM,IAAA,IAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,IAAA;AAC/D,MAAA,IAAI,CAAC,YAAA,IAAgB,MAAA,CAAO,CAAC,CAAA,KAAM,IAAA,EAAM,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,IAAA,EAAK;AACxE,MAAA,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,MAAA,CAAO,CAAC,CAAA,EAAE;AAAA,IACtC,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAA,CACE,GAAA,EACA,OAAA,EACA,KAAA,EACA,UACA,WAAA,EACM;AACN,IAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,IAAA,MAAM,aAAa,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,MAAM,UAAA,GAAc,MAAA,CAAwD,WAAA,IAAe,GAAA,CAAI,MAAA,CAAO,KAAA;AAEtG,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,cAAc,IAAA,CAAK,KAAA;AACvB,IAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AAEf,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAA,CAAE,UAAU,IAAA,EAAM;AAAE,QAAA,OAAA,GAAU,KAAA;AAAO,QAAA;AAAA,MAAU;AACnD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,WAAW,CAAA;AACzD,MAAA,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,OAAA,GAAU,IAAA,CAAA;AAAA,IAC7D;AAEA,IAAA,GAAA,CAAI,MAAA,EAAO;AAAA,EACb;AACF,CAAA;;;AC9FA,IAAM,iBAAiB,CAAC,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,IAAI,GAAG,CAAA;AAC1C,IAAM,gBAAgB,CAAC,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,WAAW,SAAS,CAAA;AAErE,IAAM,WAAN,MAAqC;AAAA,EAI1C,WAAA,CACE,KAAA,GAAQ,SAAA,EACS,MAAA,GAAsB,OAAA,EACvC;AADiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AALnB,IAAA,IAAA,CAAS,IAAA,GAAO,UAAA;AAOd,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,QAAQ,IAAA,EAAqC;AAC3C,IAAA,MAAM,GAAA,GAAM,CAAC,QAAA,EAAkB,MAAA,KAAkC;AAC/D,MAAA,IAAI,QAAA,GAAW,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AAClC,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,KAAA,IAAS,CAAA,GAAI,QAAA,GAAW,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,QAAA,EAAU,CAAA,EAAA,EAAK,GAAA,IAAO,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,EAAG,KAAK,MAAM,CAAA;AAC7F,MAAA,OAAO,GAAA,GAAM,MAAA;AAAA,IACf,CAAA;AAEA,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,MAAO;AAAA,MACzB,KAAA,EAAO,CAAA;AAAA,MACP,KAAA,EAAO,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA;AAAA;AAAA,MACf,KAAA,EAAO,GAAA,CAAI,CAAA,EAAG,EAAE,CAAA;AAAA;AAAA,MAChB,KAAA,EAAO,GAAA,CAAI,CAAA,EAAG,EAAE,CAAA;AAAA;AAAA,MAChB,MAAA,EAAQ,GAAA,CAAI,CAAA,EAAG,EAAE,CAAA;AAAA;AAAA,MACjB,SAAA,EAAW,GAAA,CAAI,CAAA,EAAG,GAAG;AAAA;AAAA,KACvB,CAAE,CAAA;AAAA,EACJ;AAAA,EAEA,MAAA,CACE,GAAA,EACA,OAAA,EACA,KAAA,EACA,UACA,WAAA,EACM;AACN,IAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,IAAA,MAAM,aAAa,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,MAAM,UAAA,GAAc,MAAA,CAAwD,WAAA,IAAe,GAAA,CAAI,MAAA,CAAO,KAAA;AACtG,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AAGf,IAAA,MAAM,OAAmB,CAAC,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,UAAU,WAAW,CAAA;AAE1E,IAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,cAAA,CAAe,QAAQ,EAAA,EAAA,EAAM;AACjD,MAAA,MAAM,GAAA,GAAM,KAAK,EAAE,CAAA;AACnB,MAAA,MAAM,SAAA,GAAY,cAAc,EAAE,CAAA;AAElC,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,WAAA,GAAc,SAAA;AAClB,MAAA,IAAI,OAAA,GAAU,KAAA;AAEd,MAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,QAAA,MAAM,GAAA,GAAM,EAAE,GAAG,CAAA;AACjB,QAAA,IAAI,OAAO,IAAA,EAAM;AAAE,UAAA,OAAA,GAAU,KAAA;AAAO,UAAA;AAAA,QAAU;AAC9C,QAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,QAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,GAAA,EAAK,YAAY,WAAW,CAAA;AACrD,QAAA,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,OAAA,GAAU,IAAA,CAAA;AAAA,MAC7D;AACA,MAAA,GAAA,CAAI,MAAA,EAAO;AAAA,IACb;AAAA,EAEF;AACF,CAAA;;;ACrEO,IAAM,iBAAN,MAA2C;AAAA,EAIhD,WAAA,CACmB,MAAA,GAAS,EAAA,EACT,gBAAA,GAAmB,CAAA,EACpC,QAAQ,SAAA,EACR,IAAA,GAAO,IAAA,EACU,MAAA,GAAsB,OAAA,EACvC;AALiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AAGA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAEjB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,QAAQ,IAAA,EAAqC;AAC3C,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AACxB,MAAA,IAAI,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAK;AAElF,MAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,IAAA,CAAK,SAAS,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,UAAU,CAAA,EAAG,IAAA,CAAK,MAAM,CAAC,CAAA;AACzF,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,IAAA,CAAK,MAAA;AACrD,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAA,CAAK,CAAA,GAAI,IAAA,KAAS,CAAA,EAAG,CAAC,CAAA,GAAI,IAAA,CAAK,MAAA;AACvE,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AAE9B,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,CAAA;AAAA,QACP,KAAA,EAAO,IAAA;AAAA,QACP,KAAA,EAAO,IAAA,GAAO,GAAA,GAAM,IAAA,CAAK,gBAAA;AAAA,QACzB,KAAA,EAAO,IAAA,GAAO,GAAA,GAAM,IAAA,CAAK;AAAA,OAC3B;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAA,CACE,GAAA,EACA,OAAA,EACA,KAAA,EACA,UACA,WAAA,EACM;AACN,IAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,IAAA,MAAM,aAAa,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,MAAM,UAAA,GAAc,GAAA,CAAI,MAAA,CAAwD,WAAA,IAAe,IAAI,MAAA,CAAO,KAAA;AAC1G,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AAEf,IAAA,MAAM,QAAA,GAAW,CAAC,QAAA,EAA6D,IAAA,GAAO,KAAA,KAAU;AAC9F,MAAA,IAAI,MAAM,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AAChC,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,IAAI,OAAA,GAAU,KAAA;AACd,MAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,QAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AACtB,QAAA,IAAI,OAAO,IAAA,EAAM;AAAE,UAAA,OAAA,GAAU,KAAA;AAAO,UAAA;AAAA,QAAU;AAC9C,QAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,QAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,GAAA,EAAK,YAAY,WAAW,CAAA;AACrD,QAAA,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,OAAA,GAAU,IAAA,CAAA;AAAA,MAC7D;AACA,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,IAAI,IAAA,EAAM,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAAA,IAC9B,CAAA;AAEA,IAAA,GAAA,CAAI,cAAc,IAAA,CAAK,KAAA;AACvB,IAAA,QAAA,CAAS,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA;AAEvB,IAAA,GAAA,CAAI,WAAA,GAAc,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,EAAA,CAAA;AAC/B,IAAA,QAAA,CAAS,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,EAAO,IAAI,CAAA;AAC7B,IAAA,QAAA,CAAS,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,EAAO,IAAI,CAAA;AAG7B,IAAA,MAAM,cAAkC,EAAC;AACzC,IAAA,MAAM,cAAkC,EAAC;AAEzC,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAA,CAAE,KAAA,IAAS,IAAA,IAAQ,CAAA,CAAE,SAAS,IAAA,EAAM;AACxC,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,EAAG,KAAA,CAAM,QAAA,CAAS,EAAE,KAAA,EAAO,UAAA,EAAY,WAAW,CAAC,CAAC,CAAA;AACtE,MAAA,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,EAAG,KAAA,CAAM,QAAA,CAAS,EAAE,KAAA,EAAO,UAAA,EAAY,WAAW,CAAC,CAAC,CAAA;AAAA,IACxE;AAEA,IAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAE5B,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,WAAA,CAAY,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAA,EAAG,MAAM,CAAA,KAAM,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA,GAAI,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA;AAChF,IAAA,WAAA,CAAY,OAAA,EAAQ,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA;AAC1D,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,EAAA,CAAA;AAC7B,IAAA,GAAA,CAAI,IAAA,EAAK;AAAA,EACX;AACF;;;AC3FO,IAAM,kBAAN,MAA4C;AAAA,EAIjD,WAAA,CACmB,MAAA,GAAS,EAAA,EACT,IAAA,GAAO,CAAA,EACP,YAAY,EAAA,EAC7B,KAAA,GAAQ,SAAA,EACR,IAAA,GAAO,IAAA,EACP;AALiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAIjB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,QAAQ,IAAA,EAAqC;AAC3C,IAAA,MAAM,UAA6B,EAAC;AACpC,IAAA,MAAM,IAAA,GAAO,CAAA,IAAK,IAAA,CAAK,MAAA,GAAS,CAAA,CAAA;AAEhC,IAAA,IAAI,GAAA,GAAqB,IAAA;AACzB,IAAA,IAAI,GAAA,GAAqB,IAAA;AAEzB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAElB,MAAA,IAAI,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AACvB,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,MAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,CAAA;AAChE,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,IAAI,GAAA,GAAM,CAAA;AACV,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,KAAK,GAAA,IAAO,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,CAAE,KAAA;AACzD,QAAA,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA;AAAA,MACnB,CAAA,MAAO;AACL,QAAA,GAAA,GAAM,GAAA,CAAI,KAAA,GAAQ,IAAA,GAAO,GAAA,IAAO,CAAA,GAAI,IAAA,CAAA;AAAA,MACtC;AAGA,MAAA,MAAM,KAAK,CAAA,KAAM,CAAA,GACb,IAAI,IAAA,GAAO,GAAA,CAAI,MACf,IAAA,CAAK,GAAA;AAAA,QACH,GAAA,CAAI,OAAO,GAAA,CAAI,GAAA;AAAA,QACf,IAAA,CAAK,IAAI,GAAA,CAAI,IAAA,GAAO,KAAK,CAAA,GAAI,CAAC,EAAE,KAAK,CAAA;AAAA,QACrC,IAAA,CAAK,IAAI,GAAA,CAAI,GAAA,GAAM,KAAK,CAAA,GAAI,CAAC,EAAE,KAAK;AAAA,OACtC;AAGJ,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,WAAW,CAAA,EAAA,EAAK;AACvC,UAAA,MAAM,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AACpB,UAAA,MAAM,IAAA,GAAO,IAAI,CAAA,GAAI,CAAA,GAAI,KAAK,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAAI,IAAA;AAC3C,UAAA,MAAM,MAAM,IAAA,IAAQ,IAAA,GAChB,EAAE,IAAA,GAAO,CAAA,CAAE,MACX,IAAA,CAAK,GAAA;AAAA,YACH,CAAA,CAAE,OAAO,CAAA,CAAE,GAAA;AAAA,YACX,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,IAAA,GAAO,KAAK,KAAK,CAAA;AAAA,YAC5B,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,GAAA,GAAM,KAAK,KAAK;AAAA,WAC7B;AACJ,UAAA,KAAA,IAAS,GAAA;AAAA,QACX;AACA,QAAA,GAAA,GAAM,QAAQ,IAAA,CAAK,SAAA;AAAA,MACrB,CAAA,MAAO;AACL,QAAA,GAAA,GAAA,CAAO,GAAA,IAAO,IAAA,CAAK,SAAA,GAAY,CAAA,CAAA,GAAK,MAAM,IAAA,CAAK,SAAA;AAAA,MACjD;AAEA,MAAA,MAAM,KAAA,GAAQ,GAAA,GAAM,IAAA,CAAK,IAAA,GAAO,GAAA;AAChC,MAAA,MAAM,KAAA,GAAQ,GAAA,GAAM,IAAA,CAAK,IAAA,GAAO,GAAA;AAChC,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAG,OAAO,GAAA,EAAK,KAAA,EAAO,OAAO,CAAA;AAAA,IACrD;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAA,CACE,GAAA,EACA,OAAA,EACA,KAAA,EACA,UACA,WAAA,EACM;AACN,IAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,IAAA,MAAM,aAAa,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,MAAM,UAAA,GAAc,MAAA,CAAwD,WAAA,IAAe,GAAA,CAAI,MAAA,CAAO,KAAA;AACtG,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AAEf,IAAA,MAAM,QAAA,GAAW,CAAC,QAAA,EAA6D,IAAA,GAAO,KAAA,KAAU;AAC9F,MAAA,IAAI,MAAM,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AAChC,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,IAAI,OAAA,GAAU,KAAA;AACd,MAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,QAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AACtB,QAAA,IAAI,OAAO,IAAA,EAAM;AAAE,UAAA,OAAA,GAAU,KAAA;AAAO,UAAA;AAAA,QAAU;AAC9C,QAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,QAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,GAAA,EAAK,YAAY,WAAW,CAAA;AACrD,QAAA,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,OAAA,GAAU,IAAA,CAAA;AAAA,MAC7D;AACA,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,IAAI,IAAA,EAAM,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAAA,IAC9B,CAAA;AAGA,IAAA,GAAA,CAAI,cAAc,IAAA,CAAK,KAAA;AACvB,IAAA,QAAA,CAAS,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA;AAGvB,IAAA,GAAA,CAAI,WAAA,GAAc,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,EAAA,CAAA;AAC/B,IAAA,QAAA,CAAS,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,EAAO,IAAI,CAAA;AAC7B,IAAA,QAAA,CAAS,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,EAAO,IAAI,CAAA;AAG7B,IAAA,MAAM,cAAkC,EAAC;AACzC,IAAA,MAAM,cAAkC,EAAC;AAEzC,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAA,CAAE,KAAA,IAAS,IAAA,IAAQ,CAAA,CAAE,SAAS,IAAA,EAAM;AACxC,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,EAAG,KAAA,CAAM,QAAA,CAAS,EAAE,KAAA,EAAO,UAAA,EAAY,WAAW,CAAC,CAAC,CAAA;AACtE,MAAA,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,EAAG,KAAA,CAAM,QAAA,CAAS,EAAE,KAAA,EAAO,UAAA,EAAY,WAAW,CAAC,CAAC,CAAA;AAAA,IACxE;AAEA,IAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAE5B,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,WAAA,CAAY,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAA,EAAG,MAAM,CAAA,KAAM,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA,GAAI,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA;AAChF,IAAA,WAAA,CAAY,OAAA,EAAQ,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA;AAC1D,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,EAAA,CAAA;AAC7B,IAAA,GAAA,CAAI,IAAA,EAAK;AAAA,EACX;AACF,CAAA;;;ACvIO,IAAM,mBAAN,MAA6C;AAAA,EAIlD,WAAA,CACmB,MAAA,GAAS,EAAA,EAC1B,KAAA,GAAQ,SAAA,EACR;AAFiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAJnB,IAAA,IAAA,CAAS,IAAA,GAAO,IAAA;AAOd,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,QAAQ,IAAA,EAAqC;AAC3C,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AACxB,MAAA,IAAI,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,OAAO,IAAA,EAAK;AAElF,MAAA,IAAI,OAAA,GAAU,CAAA,QAAA;AACd,MAAA,IAAI,MAAA,GAAS,QAAA;AACb,MAAA,KAAA,IAAS,IAAI,CAAA,GAAI,IAAA,CAAK,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC7C,QAAA,IAAI,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,GAAO,SAAS,OAAA,GAAU,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA;AAC9C,QAAA,IAAI,IAAA,CAAK,CAAC,CAAA,CAAE,GAAA,GAAM,QAAQ,MAAA,GAAS,IAAA,CAAK,CAAC,CAAA,CAAE,GAAA;AAAA,MAC7C;AAEA,MAAA,MAAM,MAAA,GAAA,CAAU,UAAU,MAAA,IAAU,CAAA;AACpC,MAAA,OAAO,EAAE,OAAO,CAAA,EAAG,KAAA,EAAO,QAAQ,KAAA,EAAO,OAAA,EAAS,OAAO,MAAA,EAAO;AAAA,IAClE,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAA,CACE,GAAA,EACA,OAAA,EACA,KAAA,EACA,UACA,WAAA,EACM;AACN,IAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,IAAA,MAAM,aAAa,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,MAAM,UAAA,GAAc,MAAA,CAAwD,WAAA,IAAe,GAAA,CAAI,MAAA,CAAO,KAAA;AACtG,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AAEf,IAAA,MAAM,QAAA,GAAW,CAAC,QAAA,EAA6D,IAAA,GAAO,KAAA,KAAU;AAC9F,MAAA,IAAI,MAAM,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AAChC,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,IAAI,OAAA,GAAU,KAAA;AACd,MAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,QAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AACtB,QAAA,IAAI,OAAO,IAAA,EAAM;AAAE,UAAA,OAAA,GAAU,KAAA;AAAO,UAAA;AAAA,QAAU;AAC9C,QAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,QAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,GAAA,EAAK,YAAY,WAAW,CAAA;AACrD,QAAA,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,OAAA,GAAU,IAAA,CAAA;AAAA,MAC7D;AACA,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,IAAI,IAAA,EAAM,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAAA,IAC9B,CAAA;AAGA,IAAA,GAAA,CAAI,cAAc,IAAA,CAAK,KAAA;AACvB,IAAA,QAAA,CAAS,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,EAAO,IAAI,CAAA;AAG7B,IAAA,GAAA,CAAI,WAAA,GAAc,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,EAAA,CAAA;AAC/B,IAAA,QAAA,CAAS,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA;AACvB,IAAA,QAAA,CAAS,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA;AAGvB,IAAA,MAAM,cAAkC,EAAC;AACzC,IAAA,MAAM,cAAkC,EAAC;AAEzC,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAA,CAAE,KAAA,IAAS,IAAA,IAAQ,CAAA,CAAE,SAAS,IAAA,EAAM;AACxC,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,EAAG,KAAA,CAAM,QAAA,CAAS,EAAE,KAAA,EAAO,UAAA,EAAY,WAAW,CAAC,CAAC,CAAA;AACtE,MAAA,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,EAAG,KAAA,CAAM,QAAA,CAAS,EAAE,KAAA,EAAO,UAAA,EAAY,WAAW,CAAC,CAAC,CAAA;AAAA,IACxE;AAEA,IAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAE5B,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,WAAA,CAAY,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAA,EAAG,MAAM,CAAA,KAAM,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA,GAAI,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA;AAChF,IAAA,WAAA,CAAY,KAAA,EAAM,CAAE,OAAA,EAAQ,CAAE,QAAQ,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA;AAClE,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,EAAA,CAAA;AAC7B,IAAA,GAAA,CAAI,IAAA,EAAK;AAAA,EACX;AACF,CAAA;;;ACtFO,IAAM,MAAN,MAAgC;AAAA,EAMnC,YACqB,MAAA,GAAiB,EAAA,EAClC,KAAA,GAAQ,SAAA,EACR,OAAO,KAAA,EACT;AAHmB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAJrB,IAAA,IAAA,CAAS,IAAA,GAAO,KAAA;AAChB,IAAA,IAAA,CAAS,UAAA,GAAa,EAAA;AAOlB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACjB;AAAA,EAEA,QAAQ,IAAA,EAAqC;AACzC,IAAA,MAAM,UAA6B,EAAC;AAEpC,IAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,OAAA;AAG9B,IAAA,MAAM,KAAe,EAAC;AACtB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAClC,MAAA,IAAI,MAAM,CAAA,EAAG;AACT,QAAA,EAAA,CAAG,IAAA,CAAK,KAAK,CAAC,CAAA,CAAE,OAAO,IAAA,CAAK,CAAC,EAAE,GAAG,CAAA;AAAA,MACtC,CAAA,MAAO;AACH,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,CAAE,KAAA;AAC9B,QAAA,EAAA,CAAG,KAAK,IAAA,CAAK,GAAA;AAAA,UACT,KAAK,CAAC,CAAA,CAAE,IAAA,GAAO,IAAA,CAAK,CAAC,CAAA,CAAE,GAAA;AAAA,UACvB,KAAK,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,CAAE,OAAO,SAAS,CAAA;AAAA,UACjC,KAAK,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,CAAE,MAAM,SAAS;AAAA,SACnC,CAAA;AAAA,MACL;AAAA,IACJ;AAGA,IAAA,IAAI,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,EAAQ;AAC3B,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,IAAA,EAAK,CAAE,CAAA;AAAA,IACzD;AAGA,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAClC,MAAA,GAAA,IAAO,GAAG,CAAC,CAAA;AAAA,IACf;AACA,IAAA,GAAA,IAAO,IAAA,CAAK,MAAA;AAGZ,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AACtC,MAAA,OAAA,CAAQ,KAAK,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AAAA,IAC1C;AAGA,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,IAAA,CAAK,SAAS,CAAA,EAAG,KAAA,EAAO,KAAK,CAAA;AAGnD,IAAA,KAAA,IAAS,IAAI,IAAA,CAAK,MAAA,EAAQ,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAC5C,MAAA,GAAA,GAAA,CAAO,OAAO,IAAA,CAAK,MAAA,GAAS,KAAK,EAAA,CAAG,CAAC,KAAK,IAAA,CAAK,MAAA;AAC/C,MAAA,OAAA,CAAQ,KAAK,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,KAAK,CAAA;AAAA,IACzC;AAEA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEA,cAAc,OAAA,EAAwC;AAClD,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM,MAAA,GAAS,KAAK,GAAA,CAAI,MAAA,EAAQ,EAAE,KAAK,CAAA;AAAA,IAC1D;AACA,IAAA,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,SAAS,GAAA,EAAI;AAAA,EACvC;AAAA,EAEA,OACI,GAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,EACA,YACA,aAAA,EACI;AACJ,IAAA,MAAM,UAAA,GAAc,GAAA,CAAI,MAAA,CAAwD,WAAA,IACzE,IAAI,MAAA,CAAO,KAAA;AAGlB,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM,MAAA,GAAS,KAAK,GAAA,CAAI,MAAA,EAAQ,EAAE,KAAK,CAAA;AAAA,IAC1D;AACA,IAAA,MAAM,QAAQ,aAAA,IAAiB,EAAE,KAAK,CAAA,EAAG,GAAA,EAAK,SAAS,GAAA,EAAI;AAG3D,IAAA,MAAM,SAAqC,EAAC;AAC5C,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM;AACrB,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,GAAG,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AAAA,QAC/C,GAAG,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,OAAO,UAAU;AAAA,OAC/C,CAAA;AAAA,IACL;AAEA,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AAGzB,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,QAAA,CAAS,CAAA,EAAG,OAAO,UAAU,CAAA;AACjD,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,CAAE,GAAG,KAAK,CAAA;AAC7B,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC3C,IAAA,GAAA,CAAI,OAAO,MAAA,CAAO,MAAA,CAAO,SAAS,CAAC,CAAA,CAAE,GAAG,KAAK,CAAA;AAC7C,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,SAAA,GAAY,KAAK,KAAA,GAAQ,IAAA;AAC7B,IAAA,GAAA,CAAI,IAAA,EAAK;AAGT,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,cAAc,IAAA,CAAK,KAAA;AACvB,IAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AACf,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM;AAAE,QAAA,OAAA,GAAU,KAAA;AAAO,QAAA;AAAA,MAAU;AAClD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,OAAO,UAAU,CAAA;AACnD,MAAA,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,OAAA,GAAU,IAAA,CAAA;AAAA,IAC/D;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AAAA,EACf;AACJ,CAAA;;;AC7HO,IAAM,MAAN,MAAgC;AAAA,EAMnC,WAAA,CACqB,SAAiB,EAAA,EAClC,KAAA,GAAQ,WACR,IAAA,GAAO,KAAA,EACU,SAAsB,OAAA,EACzC;AAJmB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAGA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAPrB,IAAA,IAAA,CAAS,IAAA,GAAO,KAAA;AAChB,IAAA,IAAA,CAAS,UAAA,GAAa,EAAA;AAQlB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACjB;AAAA,EAEA,QAAQ,IAAA,EAAqC;AACzC,IAAA,MAAM,UAA6B,EAAC;AAEpC,IAAA,IAAI,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAC/B,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,IAAA,EAAK,CAAE,CAAA;AAAA,IACzD;AAGA,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI,OAAA,GAAU,CAAA;AAGd,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACnC,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,CAAC,GAAG,IAAA,CAAK,MAAM,CAAA,GAAI,SAAA,CAAU,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,EAAG,KAAK,MAAM,CAAA;AAClF,MAAA,IAAI,KAAA,GAAQ,GAAG,OAAA,IAAW,KAAA;AAAA,WACrB,OAAA,IAAW,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAAA,IAClC;AACA,IAAA,OAAA,IAAW,IAAA,CAAK,MAAA;AAChB,IAAA,OAAA,IAAW,IAAA,CAAK,MAAA;AAGhB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAClC,MAAA,OAAA,CAAQ,KAAK,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AAAA,IAC1C;AAGA,IAAA,MAAM,GAAA,GAAM,OAAA,KAAY,CAAA,GAAI,QAAA,GAAW,OAAA,GAAU,OAAA;AACjD,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,OAAA,KAAY,CAAA,GAAI,GAAA,GAAM,GAAA,GAAM,GAAA,IAAO,CAAA,GAAI,MAAM,CAAA;AAGvF,IAAA,KAAA,IAAS,IAAI,IAAA,CAAK,MAAA,GAAS,GAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAChD,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,CAAC,GAAG,IAAA,CAAK,MAAM,CAAA,GAAI,SAAA,CAAU,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,EAAG,KAAK,MAAM,CAAA;AAClF,MAAA,MAAM,IAAA,GAAQ,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,CAAA;AAClC,MAAA,MAAM,OAAQ,KAAA,GAAQ,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,CAAA;AAC5C,MAAA,OAAA,GAAA,CAAW,OAAA,IAAW,IAAA,CAAK,MAAA,GAAS,CAAA,CAAA,GAAK,QAAQ,IAAA,CAAK,MAAA;AACtD,MAAA,OAAA,GAAA,CAAW,OAAA,IAAW,IAAA,CAAK,MAAA,GAAS,CAAA,CAAA,GAAK,QAAQ,IAAA,CAAK,MAAA;AACtD,MAAA,MAAM,EAAA,GAAK,OAAA,KAAY,CAAA,GAAI,QAAA,GAAW,OAAA,GAAU,OAAA;AAChD,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,OAAA,KAAY,CAAA,GAAI,GAAA,GAAM,GAAA,GAAM,GAAA,IAAO,CAAA,GAAI,EAAA,CAAA,EAAK,CAAA;AAAA,IAChF;AAEA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEA,cAAc,QAAA,EAAyC;AACnD,IAAA,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,GAAA,EAAI;AAAA,EAC9B;AAAA,EAEA,OACI,GAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,EACA,YACA,aAAA,EACI;AACJ,IAAA,MAAM,UAAA,GAAc,GAAA,CAAI,MAAA,CAAwD,WAAA,IACzE,IAAI,MAAA,CAAO,KAAA;AAElB,IAAA,MAAM,QAAQ,aAAA,IAAiB,EAAE,GAAA,EAAK,CAAA,EAAG,KAAK,GAAA,EAAI;AAGlD,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,QAAA,CAAS,EAAA,EAAI,OAAO,UAAU,CAAA;AAChD,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,QAAA,CAAS,EAAA,EAAI,OAAO,UAAU,CAAA;AAEhD,IAAA,GAAA,CAAI,SAAA,GAAY,sBAAA;AAChB,IAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,UAAA,EAAY,GAAG,CAAA;AAElC,IAAA,GAAA,CAAI,SAAA,GAAY,uBAAA;AAChB,IAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,GAAA,EAAK,UAAA,EAAY,aAAa,GAAG,CAAA;AAGjD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,IAAA,GAAA,CAAI,WAAA,GAAc,wBAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,KAAA,MAAW,KAAA,IAAS,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA,EAAG;AAC9B,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,KAAA,EAAO,OAAO,UAAU,CAAA;AACjD,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AACf,MAAA,GAAA,CAAI,MAAA,CAAO,YAAY,CAAC,CAAA;AACxB,MAAA,GAAA,CAAI,MAAA,EAAO;AAAA,IACf;AACA,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,IAAA,GAAA,CAAI,OAAA,EAAQ;AAGZ,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,cAAc,IAAA,CAAK,KAAA;AACvB,IAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AAEf,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,UAAU,IAAA,EAAM;AAAE,QAAA,OAAA,GAAU,KAAA;AAAO,QAAA;AAAA,MAAU;AACnD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,OAAO,UAAU,CAAA;AACnD,MAAA,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,OAAA,GAAU,IAAA,CAAA;AAAA,IAC/D;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AAAA,EACf;AACJ;;;ACrHO,IAAM,aAAN,MAAuC;AAAA,EAM1C,YACqB,OAAA,GAAkB,EAAA,EAClB,OAAA,GAAkB,CAAA,EACnC,QAAQ,SAAA,EACV;AAHmB,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAPrB,IAAA,IAAA,CAAS,IAAA,GAAO,OAAA;AAEhB,IAAA,IAAA,CAAS,IAAA,GAAO,KAAA;AAChB,IAAA,IAAA,CAAS,UAAA,GAAa,EAAA;AAOlB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACjB;AAAA,EAEA,QAAQ,IAAA,EAAqC;AACzC,IAAA,MAAM,UAA6B,EAAC;AACpC,IAAA,MAAM,UAA6B,EAAC;AAEpC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAClC,MAAA,IAAI,CAAA,GAAI,IAAA,CAAK,OAAA,GAAU,CAAA,EAAG;AACtB,QAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AACjB,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAG,OAAO,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AACnD,QAAA;AAAA,MACJ;AAEA,MAAA,IAAI,SAAA,GAAY,QAAA;AAChB,MAAA,IAAI,WAAA,GAAc,CAAA,QAAA;AAClB,MAAA,KAAA,IAAS,IAAI,CAAA,GAAI,IAAA,CAAK,UAAU,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC5C,QAAA,IAAI,IAAA,CAAK,CAAC,CAAA,CAAE,GAAA,GAAM,WAAW,SAAA,GAAY,IAAA,CAAK,CAAC,CAAA,CAAE,GAAA;AACjD,QAAA,IAAI,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,GAAO,aAAa,WAAA,GAAc,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA;AAAA,MAC1D;AAEA,MAAA,MAAM,QAAQ,WAAA,GAAc,SAAA;AAC5B,MAAA,MAAM,CAAA,GAAI,UAAU,CAAA,GAAI,EAAA,GAAA,CAAO,KAAK,CAAC,CAAA,CAAE,KAAA,GAAQ,SAAA,IAAa,KAAA,GAAS,GAAA;AACrE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAG,OAAO,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AAAA,IACpD;AAGA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAClC,MAAA,MAAM,IAAA,GAAO,QAAQ,CAAC,CAAA;AACtB,MAAA,IAAI,SAAS,IAAA,EAAM;AAGnB,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,IAAK,KAAK,KAAA,GAAQ,IAAA,CAAK,SAAS,CAAA,EAAA,EAAK;AACjD,QAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,KAAM,IAAA,EAAM;AACzB,QAAA,GAAA,IAAO,QAAQ,CAAC,CAAA;AAChB,QAAA,KAAA,EAAA;AAAA,MACJ;AACA,MAAA,IAAI,KAAA,KAAU,KAAK,OAAA,EAAS;AACxB,QAAA,OAAA,CAAQ,CAAC,CAAA,CAAE,KAAA,GAAQ,GAAA,GAAM,IAAA,CAAK,OAAA;AAAA,MAClC;AAAA,IACJ;AAEA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEA,cAAc,QAAA,EAAyC;AACnD,IAAA,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,GAAA,EAAI;AAAA,EAC9B;AAAA,EAEA,OACI,GAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,EACA,YACA,aAAA,EACI;AACJ,IAAA,MAAM,UAAA,GAAc,GAAA,CAAI,MAAA,CAAwD,WAAA,IACzE,IAAI,MAAA,CAAO,KAAA;AAElB,IAAA,MAAM,QAAQ,aAAA,IAAiB,EAAE,GAAA,EAAK,CAAA,EAAG,KAAK,GAAA,EAAI;AAGlD,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,QAAA,CAAS,EAAA,EAAI,OAAO,UAAU,CAAA;AAChD,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,QAAA,CAAS,EAAA,EAAI,OAAO,UAAU,CAAA;AAEhD,IAAA,GAAA,CAAI,SAAA,GAAY,sBAAA;AAChB,IAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,UAAA,EAAY,GAAG,CAAA;AAElC,IAAA,GAAA,CAAI,SAAA,GAAY,uBAAA;AAChB,IAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,GAAA,EAAK,UAAA,EAAY,aAAa,GAAG,CAAA;AAGjD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,IAAA,GAAA,CAAI,WAAA,GAAc,wBAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,KAAA,MAAW,KAAA,IAAS,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA,EAAG;AAC9B,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,KAAA,EAAO,OAAO,UAAU,CAAA;AACjD,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AACf,MAAA,GAAA,CAAI,MAAA,CAAO,YAAY,CAAC,CAAA;AACxB,MAAA,GAAA,CAAI,MAAA,EAAO;AAAA,IACf;AACA,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,IAAA,GAAA,CAAI,OAAA,EAAQ;AAGZ,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,cAAc,IAAA,CAAK,KAAA;AACvB,IAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AACf,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,UAAU,IAAA,EAAM;AAAE,QAAA,OAAA,GAAU,KAAA;AAAO,QAAA;AAAA,MAAU;AACnD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,OAAO,UAAU,CAAA;AACnD,MAAA,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,OAAA,GAAU,IAAA,CAAA;AAAA,IAC/D;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,WAAA,GAAc,SAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AACf,IAAA,OAAA,GAAU,KAAA;AACV,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM;AAAE,QAAA,OAAA,GAAU,KAAA;AAAO,QAAA;AAAA,MAAU;AAClD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,OAAO,UAAU,CAAA;AACnD,MAAA,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,OAAA,GAAU,IAAA,CAAA;AAAA,IAC/D;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AAAA,EACf;AACJ,CAAA;;;ACjIA,SAAS,UAAA,CAAW,QAA2B,MAAA,EAAmC;AAC9E,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,IAAI,CAAA,GAAI,SAAS,CAAA,EAAG;AAAE,MAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAG,MAAA;AAAA,IAAU;AACnD,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,IAAA,KAAA,IAAS,IAAI,CAAA,GAAI,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACtC,MAAA,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,IAAA,EAAM;AAAE,QAAA,KAAA,GAAQ,KAAA;AAAO,QAAA;AAAA,MAAO;AAChD,MAAA,GAAA,IAAO,OAAO,CAAC,CAAA;AAAA,IACnB;AACA,IAAA,MAAA,CAAO,IAAA,CAAK,KAAA,GAAQ,GAAA,GAAM,MAAA,GAAS,IAAI,CAAA;AAAA,EAC3C;AACA,EAAA,OAAO,MAAA;AACX;AAEO,IAAM,WAAN,MAAqC;AAAA,EAMxC,WAAA,CACqB,SAAA,GAAoB,EAAA,EACpB,WAAA,GAAsB,EAAA,EACtB,UAAkB,CAAA,EAClB,OAAA,GAAkB,CAAA,EACnC,KAAA,GAAQ,SAAA,EACV;AALmB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AATrB,IAAA,IAAA,CAAS,IAAA,GAAO,UAAA;AAEhB,IAAA,IAAA,CAAS,IAAA,GAAO,KAAA;AAChB,IAAA,IAAA,CAAS,UAAA,GAAa,EAAA;AASlB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACjB;AAAA,EAEA,QAAQ,IAAA,EAAqC;AAEzC,IAAA,MAAM,YAA+B,EAAC;AAEtC,IAAA,IAAI,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,SAAA,GAAY,CAAA,EAAG;AAClC,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK,CAAE,CAAA;AAAA,IACtE;AAEA,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,IAAA,CAAK,WAAW,CAAA,EAAA,EAAK;AACtC,MAAA,MAAM,KAAA,GAAQ,KAAK,CAAC,CAAA,CAAE,QAAQ,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,CAAE,KAAA;AAC1C,MAAA,IAAI,KAAA,GAAQ,GAAG,OAAA,IAAW,KAAA;AAAA,WACrB,OAAA,IAAW,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAAA,IAClC;AACA,IAAA,OAAA,IAAW,IAAA,CAAK,SAAA;AAChB,IAAA,OAAA,IAAW,IAAA,CAAK,SAAA;AAEhB,IAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,IAAA,CAAK,WAAW,CAAA,EAAA,EAAK,SAAA,CAAU,KAAK,IAAI,CAAA;AAE5D,IAAA,MAAM,GAAA,GAAM,OAAA,KAAY,CAAA,GAAI,QAAA,GAAW,OAAA,GAAU,OAAA;AACjD,IAAA,SAAA,CAAU,KAAK,OAAA,KAAY,CAAA,GAAI,MAAM,GAAA,GAAM,GAAA,IAAO,IAAI,GAAA,CAAI,CAAA;AAE1D,IAAA,KAAA,IAAS,IAAI,IAAA,CAAK,SAAA,GAAY,GAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACnD,MAAA,MAAM,KAAA,GAAQ,KAAK,CAAC,CAAA,CAAE,QAAQ,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,CAAE,KAAA;AAC1C,MAAA,MAAM,IAAA,GAAO,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,CAAA;AACjC,MAAA,MAAM,OAAO,KAAA,GAAQ,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,CAAA;AAC3C,MAAA,OAAA,GAAA,CAAW,OAAA,IAAW,IAAA,CAAK,SAAA,GAAY,CAAA,CAAA,GAAK,QAAQ,IAAA,CAAK,SAAA;AACzD,MAAA,OAAA,GAAA,CAAW,OAAA,IAAW,IAAA,CAAK,SAAA,GAAY,CAAA,CAAA,GAAK,QAAQ,IAAA,CAAK,SAAA;AACzD,MAAA,MAAM,EAAA,GAAK,OAAA,KAAY,CAAA,GAAI,QAAA,GAAW,OAAA,GAAU,OAAA;AAChD,MAAA,SAAA,CAAU,KAAK,OAAA,KAAY,CAAA,GAAI,MAAM,GAAA,GAAM,GAAA,IAAO,IAAI,EAAA,CAAG,CAAA;AAAA,IAC7D;AAGA,IAAA,MAAM,iBAAoC,EAAC;AAC3C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAClC,MAAA,IAAI,SAAA,CAAU,CAAC,CAAA,KAAM,IAAA,EAAM;AAAE,QAAA,cAAA,CAAe,KAAK,IAAI,CAAA;AAAG,QAAA;AAAA,MAAU;AAGlE,MAAA,IAAI,CAAA,GAAI,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,cAAc,CAAA,EAAG;AAC3C,QAAA,cAAA,CAAe,KAAK,IAAI,CAAA;AACxB,QAAA;AAAA,MACJ;AAEA,MAAA,IAAI,MAAA,GAAS,QAAA;AACb,MAAA,IAAI,MAAA,GAAS,CAAA,QAAA;AACb,MAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,MAAA,KAAA,IAAS,IAAI,CAAA,GAAI,IAAA,CAAK,cAAc,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAChD,QAAA,IAAI,SAAA,CAAU,CAAC,CAAA,KAAM,IAAA,EAAM;AAAE,UAAA,KAAA,GAAQ,KAAA;AAAO,UAAA;AAAA,QAAO;AACnD,QAAA,MAAM,CAAA,GAAI,UAAU,CAAC,CAAA;AACrB,QAAA,IAAI,CAAA,GAAI,QAAQ,MAAA,GAAS,CAAA;AACzB,QAAA,IAAI,CAAA,GAAI,QAAQ,MAAA,GAAS,CAAA;AAAA,MAC7B;AACA,MAAA,IAAI,CAAC,KAAA,EAAO;AAAE,QAAA,cAAA,CAAe,KAAK,IAAI,CAAA;AAAG,QAAA;AAAA,MAAU;AAEnD,MAAA,MAAM,QAAQ,MAAA,GAAS,MAAA;AACvB,MAAA,MAAM,KAAA,GAAQ,UAAU,CAAA,GAAI,EAAA,GAAA,CAAO,UAAU,CAAC,CAAA,GAAe,UAAU,KAAA,GAAQ,GAAA;AAC/E,MAAA,cAAA,CAAe,KAAK,KAAK,CAAA;AAAA,IAC7B;AAGA,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,cAAA,EAAgB,IAAA,CAAK,OAAO,CAAA;AACrD,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AAE5C,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,MAAO;AAAA,MACvB,KAAA,EAAO,CAAA;AAAA,MACP,KAAA,EAAO,KAAA,CAAM,CAAC,CAAA,IAAK,IAAA;AAAA,MACnB,KAAA,EAAO,KAAA,CAAM,CAAC,CAAA,IAAK;AAAA,KACvB,CAAE,CAAA;AAAA,EACN;AAAA,EAEA,cAAc,QAAA,EAAyC;AACnD,IAAA,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,GAAA,EAAI;AAAA,EAC9B;AAAA,EAEA,OACI,GAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,EACA,YACA,aAAA,EACI;AACJ,IAAA,MAAM,UAAA,GAAc,GAAA,CAAI,MAAA,CAAwD,WAAA,IACzE,IAAI,MAAA,CAAO,KAAA;AAElB,IAAA,MAAM,QAAQ,aAAA,IAAiB,EAAE,GAAA,EAAK,CAAA,EAAG,KAAK,GAAA,EAAI;AAGlD,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,QAAA,CAAS,EAAA,EAAI,OAAO,UAAU,CAAA;AAChD,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,QAAA,CAAS,EAAA,EAAI,OAAO,UAAU,CAAA;AAEhD,IAAA,GAAA,CAAI,SAAA,GAAY,sBAAA;AAChB,IAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,UAAA,EAAY,GAAG,CAAA;AAElC,IAAA,GAAA,CAAI,SAAA,GAAY,uBAAA;AAChB,IAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,GAAA,EAAK,UAAA,EAAY,aAAa,GAAG,CAAA;AAGjD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,IAAA,GAAA,CAAI,WAAA,GAAc,wBAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,KAAA,MAAW,KAAA,IAAS,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA,EAAG;AAC9B,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,KAAA,EAAO,OAAO,UAAU,CAAA;AACjD,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AACf,MAAA,GAAA,CAAI,MAAA,CAAO,YAAY,CAAC,CAAA;AACxB,MAAA,GAAA,CAAI,MAAA,EAAO;AAAA,IACf;AACA,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,IAAA,GAAA,CAAI,OAAA,EAAQ;AAGZ,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,cAAc,IAAA,CAAK,KAAA;AACvB,IAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AACf,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,UAAU,IAAA,EAAM;AAAE,QAAA,OAAA,GAAU,KAAA;AAAO,QAAA;AAAA,MAAU;AACnD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,OAAO,UAAU,CAAA;AACnD,MAAA,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,OAAA,GAAU,IAAA,CAAA;AAAA,IAC/D;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,WAAA,GAAc,SAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AACf,IAAA,OAAA,GAAU,KAAA;AACV,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM;AAAE,QAAA,OAAA,GAAU,KAAA;AAAO,QAAA;AAAA,MAAU;AAClD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,OAAO,UAAU,CAAA;AACnD,MAAA,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,OAAA,GAAU,IAAA,CAAA;AAAA,IAC/D;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AAAA,EACf;AACJ,CAAA;;;AC3KA,SAAS,UAAA,CAAW,MAAgB,MAAA,EAAmC;AACnE,EAAA,MAAM,CAAA,GAAI,KAAK,MAAA,GAAS,CAAA,CAAA;AACxB,EAAA,MAAM,UAA6B,EAAC;AACpC,EAAA,IAAI,GAAA,GAAqB,IAAA;AAEzB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAClC,IAAA,IAAI,CAAA,GAAI,SAAS,CAAA,EAAG;AAAE,MAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAG,MAAA;AAAA,IAAU;AACpD,IAAA,IAAI,QAAQ,IAAA,EAAM;AACd,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,MAAA,EAAQ,KAAK,GAAA,IAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAClD,MAAA,GAAA,GAAM,GAAA,GAAM,MAAA;AAAA,IAChB,CAAA,MAAO;AACH,MAAA,GAAA,GAAM,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA,CAAA;AAAA,IACnC;AACA,IAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA,EACpB;AACA,EAAA,OAAO,OAAA;AACX;AAEO,IAAM,OAAN,MAAiC;AAAA,EAMpC,WAAA,CACqB,IAAA,GAAe,EAAA,EACf,IAAA,GAAe,EAAA,EACf,MAAA,GAAiB,CAAA,EAClC,KAAA,GAAQ,SAAA,EACR,IAAA,GAAO,MAAA,EACU,MAAA,GAAsB,OAAA,EACzC;AANmB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAGA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AATrB,IAAA,IAAA,CAAS,IAAA,GAAO,KAAA;AAChB,IAAA,IAAA,CAAS,UAAA,GAAa,EAAA;AAUlB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACjB;AAAA,EAEA,QAAQ,IAAA,EAAqC;AACzC,IAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,CAAA,CAAA,KAAK,UAAU,CAAA,EAAG,IAAA,CAAK,MAAM,CAAC,CAAA;AACtD,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,MAAA,EAAQ,IAAA,CAAK,IAAI,CAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,MAAA,EAAQ,IAAA,CAAK,IAAI,CAAA;AAG5C,IAAA,MAAM,QAAA,GAA8B,MAAA,CAAO,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AACrD,MAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,KAAM,IAAA,IAAQ,QAAQ,CAAC,CAAA,KAAM,MAAM,OAAO,IAAA;AACvD,MAAA,OAAQ,OAAA,CAAQ,CAAC,CAAA,GAAgB,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC9C,CAAC,CAAA;AAGD,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,KAAK,CAAC,CAAA;AAC3C,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,UAAA,EAAY,IAAA,CAAK,MAAM,CAAA;AAEpD,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,MAAA,MAAM,IAAA,GAAO,SAAS,CAAC,CAAA;AACvB,MAAA,IAAI,IAAA,KAAS,IAAA,EAAM,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,WAAW,IAAA,EAAK;AAG7F,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,IAAA,GAAO,CAAA,GAAI,KAAK,MAAA,GAAS,CAAA;AAClD,MAAA,MAAM,GAAA,GAAM,CAAA,IAAK,WAAA,GAAc,SAAA,CAAU,CAAC,CAAA,GAAI,IAAA;AAC9C,MAAA,MAAM,OAAO,IAAA,KAAS,IAAA,IAAQ,GAAA,KAAQ,IAAA,GAAO,OAAO,GAAA,GAAM,IAAA;AAE1D,MAAA,OAAO;AAAA,QACH,KAAA,EAAO,CAAA;AAAA,QACP,KAAA,EAAO,IAAA;AAAA;AAAA,QACP,KAAA,EAAO,GAAA;AAAA;AAAA,QACP,KAAA,EAAO;AAAA;AAAA,OACX;AAAA,IACJ,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,cAAc,OAAA,EAAwC;AAClD,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,KAAA,IAAS,IAAA,EAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAChE,MAAA,IAAI,CAAA,CAAE,KAAA,IAAS,IAAA,EAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAChE,MAAA,IAAI,CAAA,CAAE,KAAA,IAAS,IAAA,EAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IACpE;AACA,IAAA,OAAO,EAAE,GAAA,EAAK,CAAC,SAAS,GAAA,EAAK,GAAA,EAAK,SAAS,GAAA,EAAI;AAAA,EACnD;AAAA,EAEA,OACI,GAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,EACA,YACA,aAAA,EACI;AACJ,IAAA,MAAM,UAAA,GAAc,GAAA,CAAI,MAAA,CAAwD,WAAA,IACzE,IAAI,MAAA,CAAO,KAAA;AAGlB,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,KAAA,IAAU,IAAA,EAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AACjE,MAAA,IAAI,CAAA,CAAE,KAAA,IAAU,IAAA,EAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AACjE,MAAA,IAAI,CAAA,CAAE,KAAA,IAAU,IAAA,EAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IACrE;AACA,IAAA,MAAM,KAAA,GAAQ,iBAAiB,EAAE,GAAA,EAAK,CAAC,MAAA,GAAS,GAAA,EAAK,GAAA,EAAK,MAAA,GAAS,GAAA,EAAI;AACvE,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,QAAA,CAAS,CAAA,EAAG,OAAO,UAAU,CAAA;AAGjD,IAAA,GAAA,CAAI,WAAA,GAAc,uBAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,KAAK,CAAA;AACnB,IAAA,GAAA,CAAI,MAAA,CAAO,YAAY,KAAK,CAAA;AAC5B,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,KAAA,CAAM,gBAAgB,QAAA,EAAU,UAAU,GAAG,CAAC,CAAA;AACrE,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM;AACrB,MAAA,MAAM,IAAO,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACzD,MAAA,MAAM,OAAO,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,OAAO,UAAU,CAAA;AACtD,MAAA,MAAM,CAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,KAAK,CAAA;AAClC,MAAA,MAAM,GAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA;AACjC,MAAA,GAAA,CAAI,SAAA,GAAY,CAAA,CAAE,KAAA,IAAS,CAAA,GAAI,uBAAA,GAA0B,sBAAA;AACzD,MAAA,GAAA,CAAI,SAAS,CAAA,GAAI,KAAA,GAAQ,CAAA,EAAG,GAAA,EAAK,OAAO,CAAC,CAAA;AAAA,IAC7C;AAGA,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,cAAc,IAAA,CAAK,KAAA;AACvB,IAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AACf,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM;AAAE,QAAA,OAAA,GAAU,KAAA;AAAO,QAAA;AAAA,MAAU;AAClD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,OAAO,UAAU,CAAA;AACnD,MAAA,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,OAAA,GAAU,IAAA,CAAA;AAAA,IAC/D;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,WAAA,GAAc,SAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AACf,IAAA,OAAA,GAAU,KAAA;AACV,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM;AAAE,QAAA,OAAA,GAAU,KAAA;AAAO,QAAA;AAAA,MAAU;AAClD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,OAAO,UAAU,CAAA;AACnD,MAAA,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,OAAA,GAAU,IAAA,CAAA;AAAA,IAC/D;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AAAA,EACf;AACJ;;;ACtJO,IAAM,MAAN,MAAgC;AAAA,EAMnC,WAAA,CACqB,MAAA,GAAiB,EAAA,EAClC,KAAA,GAAQ,SAAA,EACV;AAFmB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AANrB,IAAA,IAAA,CAAS,IAAA,GAAO,KAAA;AAEhB,IAAA,IAAA,CAAS,IAAA,GAAO,KAAA;AAChB,IAAA,IAAA,CAAS,UAAA,GAAa,EAAA;AAMlB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACjB;AAAA,EAEA,QAAQ,IAAA,EAAqC;AACzC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,MAAA,IAAI,CAAA,GAAI,KAAK,MAAA,GAAS,CAAA,SAAU,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,IAAA,EAAK;AAExD,MAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,CAAM,CAAA,GAAI,KAAK,MAAA,GAAS,CAAA,EAAG,IAAI,CAAC,CAAA;AACnD,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAA,CAAM,CAAA,CAAE,OAAO,CAAA,CAAE,GAAA,GAAM,CAAA,CAAE,KAAA,IAAS,CAAC,CAAA;AAC7D,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AACrC,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,IAAA,CAAK,MAAA;AACtD,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,GAAG,CAAA,EAAG,CAAC,IAAI,IAAA,CAAK,MAAA;AAE1E,MAAA,IAAI,YAAY,CAAA,EAAG,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,OAAO,CAAA,EAAE;AAC/C,MAAA,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,QAAQ,EAAA,GAAK,GAAA,KAAQ,QAAQ,OAAA,CAAA,EAAS;AAAA,IAC7D,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,cAAc,OAAA,EAAwC;AAClD,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,KAAA,IAAS,IAAA,EAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IACpE;AACA,IAAA,OAAO,EAAE,GAAA,EAAK,CAAC,SAAS,GAAA,EAAK,GAAA,EAAK,SAAS,GAAA,EAAI;AAAA,EACnD;AAAA,EAEA,OACI,GAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,EACA,YACA,aAAA,EACI;AACJ,IAAA,MAAM,UAAA,GAAc,GAAA,CAAI,MAAA,CAAwD,WAAA,IACzE,IAAI,MAAA,CAAO,KAAA;AAGlB,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,KAAA,IAAS,IAAA,EAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IACpE;AACA,IAAA,MAAM,KAAA,GAAQ,iBAAiB,EAAE,GAAA,EAAK,CAAC,MAAA,GAAS,GAAA,EAAK,GAAA,EAAK,MAAA,GAAS,GAAA,EAAI;AAGvE,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,CAAS,GAAA,EAAK,OAAO,UAAU,CAAA;AAClD,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,QAAA,CAAS,IAAA,EAAM,OAAO,UAAU,CAAA;AAEtD,IAAA,GAAA,CAAI,SAAA,GAAY,sBAAA;AAChB,IAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,UAAA,EAAY,IAAI,CAAA;AAEnC,IAAA,GAAA,CAAI,SAAA,GAAY,uBAAA;AAChB,IAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,OAAA,EAAS,UAAA,EAAY,aAAa,OAAO,CAAA;AAGzD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,IAAA,GAAA,CAAI,WAAA,GAAc,wBAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,KAAA,MAAW,KAAA,IAAS,CAAC,GAAA,EAAK,CAAA,EAAG,IAAI,CAAA,EAAG;AAChC,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,KAAA,EAAO,OAAO,UAAU,CAAA;AACjD,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AACf,MAAA,GAAA,CAAI,MAAA,CAAO,YAAY,CAAC,CAAA;AACxB,MAAA,GAAA,CAAI,MAAA,EAAO;AAAA,IACf;AACA,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,IAAA,GAAA,CAAI,OAAA,EAAQ;AAGZ,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,cAAc,IAAA,CAAK,KAAA;AACvB,IAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AACf,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,UAAU,IAAA,EAAM;AAAE,QAAA,OAAA,GAAU,KAAA;AAAO,QAAA;AAAA,MAAU;AACnD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,OAAO,UAAU,CAAA;AACnD,MAAA,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,OAAA,GAAU,IAAA,CAAA;AAAA,IAC/D;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AAAA,EACf;AACJ,CAAA;;;AC7FO,IAAM,YAAN,MAAsC;AAAA,EAMzC,WAAA,CACqB,MAAA,GAAiB,EAAA,EAClC,KAAA,GAAQ,SAAA,EACV;AAFmB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AANrB,IAAA,IAAA,CAAS,IAAA,GAAO,IAAA;AAEhB,IAAA,IAAA,CAAS,IAAA,GAAO,KAAA;AAChB,IAAA,IAAA,CAAS,UAAA,GAAa,EAAA;AAMlB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACjB;AAAA,EAEA,QAAQ,IAAA,EAAqC;AACzC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,MAAA,IAAI,CAAA,GAAI,KAAK,MAAA,GAAS,CAAA,SAAU,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,IAAA,EAAK;AAExD,MAAA,IAAI,WAAA,GAAc,CAAA,QAAA;AAClB,MAAA,IAAI,SAAA,GAAY,QAAA;AAChB,MAAA,KAAA,IAAS,IAAI,CAAA,GAAI,IAAA,CAAK,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC3C,QAAA,IAAI,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,GAAO,aAAa,WAAA,GAAc,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA;AACtD,QAAA,IAAI,IAAA,CAAK,CAAC,CAAA,CAAE,GAAA,GAAM,WAAW,SAAA,GAAY,IAAA,CAAK,CAAC,CAAA,CAAE,GAAA;AAAA,MACrD;AAEA,MAAA,MAAM,QAAQ,WAAA,GAAc,SAAA;AAC5B,MAAA,MAAM,CAAA,GAAI,UAAU,CAAA,GAAI,GAAA,GAAA,CAAQ,cAAc,IAAA,CAAK,CAAC,CAAA,CAAE,KAAA,IAAS,KAAA,GAAS,IAAA;AACxE,MAAA,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,CAAA,EAAE;AAAA,IAChC,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,cAAc,QAAA,EAAyC;AACnD,IAAA,OAAO,EAAE,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,CAAA,EAAE;AAAA,EAC/B;AAAA,EAEA,OACI,GAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,EACA,YACA,aAAA,EACI;AACJ,IAAA,MAAM,UAAA,GAAc,GAAA,CAAI,MAAA,CAAwD,WAAA,IACzE,IAAI,MAAA,CAAO,KAAA;AAElB,IAAA,MAAM,QAAQ,aAAA,IAAiB,EAAE,GAAA,EAAK,IAAA,EAAM,KAAK,CAAA,EAAE;AAGnD,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,QAAA,CAAS,GAAA,EAAK,OAAO,UAAU,CAAA;AACpD,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,QAAA,CAAS,GAAA,EAAK,OAAO,UAAU,CAAA;AAEpD,IAAA,GAAA,CAAI,SAAA,GAAY,sBAAA;AAChB,IAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,UAAA,EAAY,MAAM,CAAA;AAErC,IAAA,GAAA,CAAI,SAAA,GAAY,uBAAA;AAChB,IAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,MAAA,EAAQ,UAAA,EAAY,aAAa,MAAM,CAAA;AAGvD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,IAAA,GAAA,CAAI,WAAA,GAAc,wBAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,KAAA,MAAW,KAAA,IAAS,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,CAAA,EAAG;AACjC,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,KAAA,EAAO,OAAO,UAAU,CAAA;AACjD,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AACf,MAAA,GAAA,CAAI,MAAA,CAAO,YAAY,CAAC,CAAA;AACxB,MAAA,GAAA,CAAI,MAAA,EAAO;AAAA,IACf;AACA,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,IAAA,GAAA,CAAI,OAAA,EAAQ;AAGZ,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,cAAc,IAAA,CAAK,KAAA;AACvB,IAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AACf,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,UAAU,IAAA,EAAM;AAAE,QAAA,OAAA,GAAU,KAAA;AAAO,QAAA;AAAA,MAAU;AACnD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,OAAO,UAAU,CAAA;AACnD,MAAA,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,OAAA,GAAU,IAAA,CAAA;AAAA,IAC/D;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AAAA,EACf;AACJ,CAAA;;;ACrFO,IAAM,MAAN,MAAgC;AAAA,EAMnC,YACqB,MAAA,GAAiB,EAAA,EAClC,KAAA,GAAQ,SAAA,EACS,SAAsB,OAAA,EACzC;AAHmB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAEA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AANrB,IAAA,IAAA,CAAS,IAAA,GAAO,KAAA;AAChB,IAAA,IAAA,CAAS,UAAA,GAAa,EAAA;AAOlB,IAAA,IAAA,CAAK,IAAA,GAAO,KAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACjB;AAAA,EAEA,QAAQ,IAAA,EAAqC;AACzC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,MAAA,IAAI,CAAA,GAAI,KAAK,MAAA,EAAQ,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,OAAO,IAAA,EAAK;AACpD,MAAA,MAAM,IAAA,GAAO,UAAU,IAAA,CAAK,CAAA,GAAI,KAAK,MAAM,CAAA,EAAG,KAAK,MAAM,CAAA;AACzD,MAAA,IAAI,SAAS,CAAA,EAAG,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,OAAO,IAAA,EAAK;AAC/C,MAAA,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAA,CAAQ,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,GAAI,IAAA,IAAQ,OAAO,GAAA,EAAI;AAAA,IACpF,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,cAAc,OAAA,EAAwC;AAClD,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,KAAA,IAAS,IAAA,EAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IACpE;AACA,IAAA,OAAO,EAAE,GAAA,EAAK,CAAC,SAAS,GAAA,EAAK,GAAA,EAAK,SAAS,GAAA,EAAI;AAAA,EACnD;AAAA,EAEA,OACI,GAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,EACA,YACA,aAAA,EACI;AACJ,IAAA,MAAM,UAAA,GAAc,GAAA,CAAI,MAAA,CAAwD,WAAA,IACzE,IAAI,MAAA,CAAO,KAAA;AAGlB,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,KAAA,IAAS,IAAA,EAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IACpE;AACA,IAAA,MAAM,KAAA,GAAQ,iBAAiB,EAAE,GAAA,EAAK,CAAC,MAAA,GAAS,GAAA,EAAK,GAAA,EAAK,MAAA,GAAS,GAAA,EAAI;AACvE,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,QAAA,CAAS,CAAA,EAAG,OAAO,UAAU,CAAA;AAGjD,IAAA,MAAM,SAAoD,EAAC;AAC3D,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM;AACrB,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,GAAG,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AAAA,QAC/C,GAAG,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,OAAO,UAAU,CAAA;AAAA,QAC5C,OAAO,CAAA,CAAE;AAAA,OACZ,CAAA;AAAA,IACL;AAGA,IAAA,IAAI,MAAA,CAAO,UAAU,CAAA,EAAG;AAEpB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,CAAE,GAAG,KAAK,CAAA;AAC7B,MAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACpB,QAAA,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,MACxC;AACA,MAAA,GAAA,CAAI,OAAO,MAAA,CAAO,MAAA,CAAO,SAAS,CAAC,CAAA,CAAE,GAAG,KAAK,CAAA;AAC7C,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,SAAA,GAAY,uBAAA;AAChB,MAAA,GAAA,CAAI,IAAA,EAAK;AAGT,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,CAAE,GAAG,KAAK,CAAA;AAC7B,MAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACpB,QAAA,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,MACxC;AACA,MAAA,GAAA,CAAI,OAAO,MAAA,CAAO,MAAA,CAAO,SAAS,CAAC,CAAA,CAAE,GAAG,KAAK,CAAA;AAC7C,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,SAAA,GAAY,sBAAA;AAChB,MAAA,GAAA,CAAI,IAAA,EAAK;AAAA,IACb;AAGA,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,IAAA,GAAA,CAAI,WAAA,GAAc,wBAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,KAAK,CAAA;AACnB,IAAA,GAAA,CAAI,MAAA,CAAO,YAAY,KAAK,CAAA;AAC5B,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,IAAA,GAAA,CAAI,OAAA,EAAQ;AAGZ,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,cAAc,IAAA,CAAK,KAAA;AACvB,IAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AACf,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,UAAU,IAAA,EAAM;AAAE,QAAA,OAAA,GAAU,KAAA;AAAO,QAAA;AAAA,MAAU;AACnD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,OAAO,UAAU,CAAA;AACnD,MAAA,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,OAAA,GAAU,IAAA,CAAA;AAAA,IAC/D;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AAAA,EACf;AACJ,CAAA;;;AClHO,IAAM,MAAN,MAAgC;AAAA,EAMnC,WAAA,CAAY,QAAQ,SAAA,EAAW;AAL/B,IAAA,IAAA,CAAS,IAAA,GAAO,KAAA;AAEhB,IAAA,IAAA,CAAS,IAAA,GAAO,KAAA;AAChB,IAAA,IAAA,CAAS,UAAA,GAAa,EAAA;AAGlB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACjB;AAAA,EAEA,QAAQ,IAAA,EAAqC;AACzC,IAAA,MAAM,UAA6B,EAAC;AACpC,IAAA,IAAI,GAAA,GAAM,CAAA;AAEV,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAClC,MAAA,IAAI,MAAM,CAAA,EAAG;AACT,QAAA,GAAA,GAAM,IAAA,CAAK,CAAC,CAAA,CAAE,MAAA,IAAU,CAAA;AAAA,MAC5B,CAAA,MAAO;AACH,QAAA,IAAI,IAAA,CAAK,CAAC,CAAA,CAAE,KAAA,GAAQ,KAAK,CAAA,GAAI,CAAC,EAAE,KAAA,EAAO;AACnC,UAAA,GAAA,IAAO,IAAA,CAAK,CAAC,CAAA,CAAE,MAAA,IAAU,CAAA;AAAA,QAC7B,CAAA,MAAA,IAAW,KAAK,CAAC,CAAA,CAAE,QAAQ,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,CAAE,KAAA,EAAO;AAC1C,UAAA,GAAA,IAAO,IAAA,CAAK,CAAC,CAAA,CAAE,MAAA,IAAU,CAAA;AAAA,QAC7B;AAAA,MAEJ;AACA,MAAA,OAAA,CAAQ,KAAK,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,KAAK,CAAA;AAAA,IACzC;AAEA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEA,cAAc,OAAA,EAAwC;AAClD,IAAA,IAAI,MAAA,GAAS,QAAA;AACb,IAAA,IAAI,MAAA,GAAS,CAAA,QAAA;AACb,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM;AACjB,QAAA,IAAI,CAAA,CAAE,KAAA,GAAQ,MAAA,EAAQ,MAAA,GAAS,CAAA,CAAE,KAAA;AACjC,QAAA,IAAI,CAAA,CAAE,KAAA,GAAQ,MAAA,EAAQ,MAAA,GAAS,CAAA,CAAE,KAAA;AAAA,MACrC;AAAA,IACJ;AACA,IAAA,IAAI,WAAW,QAAA,EAAU,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,KAAK,CAAA,EAAE;AACjD,IAAA,MAAM,OAAA,GAAA,CAAW,MAAA,GAAS,MAAA,IAAU,GAAA,IAAO,CAAA;AAC3C,IAAA,OAAO,EAAE,GAAA,EAAK,MAAA,GAAS,OAAA,EAAS,GAAA,EAAK,SAAS,OAAA,EAAQ;AAAA,EAC1D;AAAA,EAEA,OACI,GAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,EACA,YACA,aAAA,EACI;AACJ,IAAA,MAAM,UAAA,GAAc,GAAA,CAAI,MAAA,CAAwD,WAAA,IACzE,IAAI,MAAA,CAAO,KAAA;AAGlB,IAAA,IAAI,MAAA,GAAS,QAAA;AACb,IAAA,IAAI,MAAA,GAAS,CAAA,QAAA;AACb,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM;AACjB,QAAA,IAAI,CAAA,CAAE,KAAA,GAAQ,MAAA,EAAQ,MAAA,GAAS,CAAA,CAAE,KAAA;AACjC,QAAA,IAAI,CAAA,CAAE,KAAA,GAAQ,MAAA,EAAQ,MAAA,GAAS,CAAA,CAAE,KAAA;AAAA,MACrC;AAAA,IACJ;AACA,IAAA,IAAI,WAAW,QAAA,EAAU;AAEzB,IAAA,MAAM,OAAA,GAAA,CAAW,MAAA,GAAS,MAAA,IAAU,GAAA,IAAO,CAAA;AAC3C,IAAA,MAAM,KAAA,GAAQ,iBAAiB,EAAE,GAAA,EAAK,SAAS,OAAA,EAAS,GAAA,EAAK,SAAS,OAAA,EAAQ;AAC9E,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,QAAA,CAAS,CAAA,EAAG,OAAO,UAAU,CAAA;AAGjD,IAAA,MAAM,SAAoD,EAAC;AAC3D,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM;AACrB,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,GAAG,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AAAA,QAC/C,GAAG,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,OAAO,UAAU,CAAA;AAAA,QAC5C,OAAO,CAAA,CAAE;AAAA,OACZ,CAAA;AAAA,IACL;AAEA,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AAGzB,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,IAAA,GAAA,CAAI,WAAA,GAAc,wBAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,KAAK,CAAA;AACnB,IAAA,GAAA,CAAI,MAAA,CAAO,YAAY,KAAK,CAAA;AAC5B,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,IAAA,GAAA,CAAI,OAAA,EAAQ;AAIZ,IAAA,IAAI,MAAA,CAAO,UAAU,CAAA,EAAG;AACpB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,CAAE,GAAG,KAAK,CAAA;AAC7B,MAAA,KAAA,MAAW,KAAK,MAAA,EAAQ,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC3C,MAAA,GAAA,CAAI,OAAO,MAAA,CAAO,MAAA,CAAO,SAAS,CAAC,CAAA,CAAE,GAAG,KAAK,CAAA;AAC7C,MAAA,GAAA,CAAI,SAAA,EAAU;AAEd,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,CAAE,KAAA;AAC1C,MAAA,GAAA,CAAI,SAAA,GAAY,OAAA,IAAW,CAAA,GACrB,uBAAA,GACA,sBAAA;AACN,MAAA,GAAA,CAAI,IAAA,EAAK;AAAA,IACb;AAGA,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,cAAc,IAAA,CAAK,KAAA;AACvB,IAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AACf,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM;AAAE,QAAA,OAAA,GAAU,KAAA;AAAO,QAAA;AAAA,MAAU;AAClD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,OAAO,UAAU,CAAA;AACnD,MAAA,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,OAAA,GAAU,IAAA,CAAA;AAAA,IAC/D;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AAAA,EACf;AACJ,CAAA;;;AC9HO,IAAM,OAAN,MAAiC;AAAA,EAItC,WAAA,CAAY,QAAQ,SAAA,EAAW;AAH/B,IAAA,IAAA,CAAS,IAAA,GAAO,MAAA;AAId,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,QAAQ,IAAA,EAAqC;AAC3C,IAAA,MAAM,UAA6B,EAAC;AACpC,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,IAAI,MAAA,GAAS,CAAA;AAEb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,MAAA,MAAM,gBAAgB,GAAA,CAAI,IAAA,GAAO,GAAA,CAAI,GAAA,GAAM,IAAI,KAAA,IAAS,CAAA;AACxD,MAAA,MAAA,IAAU,YAAA,IAAgB,IAAI,MAAA,IAAU,CAAA,CAAA;AACxC,MAAA,MAAA,IAAU,IAAI,MAAA,IAAU,CAAA;AAExB,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,KAAA,EAAO,CAAA;AAAA,QACP,KAAA,EAAO,MAAA,KAAW,CAAA,GAAI,IAAA,GAAO,MAAA,GAAS;AAAA,OACvC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAA,CACE,GAAA,EACA,OAAA,EACA,KAAA,EACA,UACA,WAAA,EACM;AACN,IAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,IAAA,MAAM,aAAa,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,MAAM,UAAA,GAAc,MAAA,CAAwD,WAAA,IAAe,GAAA,CAAI,MAAA,CAAO,KAAA;AAEtG,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,cAAc,IAAA,CAAK,KAAA;AACvB,IAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AACf,IAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AAEtB,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAA,CAAE,UAAU,IAAA,EAAM;AAAE,QAAA,OAAA,GAAU,KAAA;AAAO,QAAA;AAAA,MAAU;AACnD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,WAAW,CAAA;AACzD,MAAA,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,OAAA,GAAU,IAAA,CAAA;AAAA,IAC7D;AAEA,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAAA,EACpB;AACF,CAAA;;;AC1DO,IAAM,kBAAN,MAA4C;AAAA,EAM/C,WAAA,CAAY,QAAQ,SAAA,EAAW;AAL/B,IAAA,IAAA,CAAS,IAAA,GAAO,KAAA;AAEhB,IAAA,IAAA,CAAS,IAAA,GAAO,KAAA;AAChB,IAAA,IAAA,CAAS,UAAA,GAAa,EAAA;AAGlB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACjB;AAAA,EAEA,QAAQ,IAAA,EAAqC;AACzC,IAAA,MAAM,UAA6B,EAAC;AACpC,IAAA,IAAI,EAAA,GAAK,CAAA;AAET,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAClC,MAAA,MAAM,EAAE,IAAA,EAAM,GAAA,EAAK,OAAO,MAAA,EAAO,GAAI,KAAK,CAAC,CAAA;AAC3C,MAAA,MAAM,QAAQ,IAAA,GAAO,GAAA;AACrB,MAAA,MAAM,MAAM,KAAA,KAAU,CAAA,GAAI,KAAM,KAAA,GAAQ,GAAA,IAAQ,OAAO,KAAA,CAAA,IAAU,KAAA;AACjE,MAAA,EAAA,IAAM,OAAO,MAAA,IAAU,CAAA,CAAA;AACvB,MAAA,OAAA,CAAQ,KAAK,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,IAAI,CAAA;AAAA,IACxC;AAEA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEA,cAAc,OAAA,EAAwC;AAClD,IAAA,IAAI,MAAA,GAAS,QAAA;AACb,IAAA,IAAI,MAAA,GAAS,CAAA,QAAA;AACb,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM;AACjB,QAAA,IAAI,CAAA,CAAE,KAAA,GAAQ,MAAA,EAAQ,MAAA,GAAS,CAAA,CAAE,KAAA;AACjC,QAAA,IAAI,CAAA,CAAE,KAAA,GAAQ,MAAA,EAAQ,MAAA,GAAS,CAAA,CAAE,KAAA;AAAA,MACrC;AAAA,IACJ;AACA,IAAA,IAAI,WAAW,QAAA,EAAU,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,KAAK,CAAA,EAAE;AACjD,IAAA,MAAM,OAAA,GAAA,CAAW,MAAA,GAAS,MAAA,IAAU,GAAA,IAAO,CAAA;AAC3C,IAAA,OAAO,EAAE,GAAA,EAAK,MAAA,GAAS,OAAA,EAAS,GAAA,EAAK,SAAS,OAAA,EAAQ;AAAA,EAC1D;AAAA,EAEA,OACI,GAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,EACA,YACA,aAAA,EACI;AACJ,IAAA,MAAM,UAAA,GAAc,GAAA,CAAI,MAAA,CAAwD,WAAA,IACzE,IAAI,MAAA,CAAO,KAAA;AAGlB,IAAA,IAAI,MAAA,GAAS,QAAA;AACb,IAAA,IAAI,MAAA,GAAS,CAAA,QAAA;AACb,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM;AACjB,QAAA,IAAI,CAAA,CAAE,KAAA,GAAQ,MAAA,EAAQ,MAAA,GAAS,CAAA,CAAE,KAAA;AACjC,QAAA,IAAI,CAAA,CAAE,KAAA,GAAQ,MAAA,EAAQ,MAAA,GAAS,CAAA,CAAE,KAAA;AAAA,MACrC;AAAA,IACJ;AACA,IAAA,IAAI,WAAW,QAAA,EAAU;AAEzB,IAAA,MAAM,OAAA,GAAA,CAAW,MAAA,GAAS,MAAA,IAAU,GAAA,IAAO,CAAA;AAC3C,IAAA,MAAM,KAAA,GAAQ,iBAAiB,EAAE,GAAA,EAAK,SAAS,OAAA,EAAS,GAAA,EAAK,SAAS,OAAA,EAAQ;AAG9E,IAAA,MAAM,SAAqC,EAAC;AAC5C,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM;AACrB,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACR,GAAG,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AAAA,QAC/C,GAAG,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,OAAO,UAAU;AAAA,OAC/C,CAAA;AAAA,IACL;AAEA,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AAGzB,IAAA,IAAI,MAAA,CAAO,UAAU,CAAA,EAAG;AACpB,MAAA,MAAM,KAAA,GAAQ,UAAA;AACd,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,CAAE,GAAG,KAAK,CAAA;AAC7B,MAAA,KAAA,MAAW,KAAK,MAAA,EAAQ,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAC3C,MAAA,GAAA,CAAI,OAAO,MAAA,CAAO,MAAA,CAAO,SAAS,CAAC,CAAA,CAAE,GAAG,KAAK,CAAA;AAC7C,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,SAAA,GAAY,KAAK,KAAA,GAAQ,IAAA;AAC7B,MAAA,GAAA,CAAI,IAAA,EAAK;AAAA,IACb;AAGA,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,cAAc,IAAA,CAAK,KAAA;AACvB,IAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AACf,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM;AAAE,QAAA,OAAA,GAAU,KAAA;AAAO,QAAA;AAAA,MAAU;AAClD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,OAAO,UAAU,CAAA;AACnD,MAAA,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,OAAA,GAAU,IAAA,CAAA;AAAA,IAC/D;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AAAA,EACf;AACJ,CAAA;;;ACtGO,IAAM,MAAN,MAAgC;AAAA,EAMnC,WAAA,CACqB,MAAA,GAAiB,EAAA,EAClC,KAAA,GAAQ,SAAA,EACV;AAFmB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAJrB,IAAA,IAAA,CAAS,IAAA,GAAO,KAAA;AAChB,IAAA,IAAA,CAAS,UAAA,GAAa,EAAA;AAMlB,IAAA,IAAA,CAAK,IAAA,GAAO,KAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACjB;AAAA,EAEA,QAAQ,IAAA,EAAqC;AACzC,IAAA,MAAM,UAA6B,EAAC;AAGpC,IAAA,MAAM,EAAA,GAAe,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAA,CAAM,CAAA,CAAE,OAAO,CAAA,CAAE,GAAA,GAAM,CAAA,CAAE,KAAA,IAAS,CAAC,CAAA;AACjE,IAAA,MAAM,KAAA,GAAkB,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,EAAA,CAAG,CAAC,CAAA,IAAK,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,CAAA;AAElE,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAClC,MAAA,IAAI,CAAA,GAAI,KAAK,MAAA,EAAQ;AACjB,QAAA,OAAA,CAAQ,KAAK,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACtC,QAAA;AAAA,MACJ;AAEA,MAAA,IAAI,MAAA,GAAS,CAAA;AACb,MAAA,IAAI,MAAA,GAAS,CAAA;AACb,MAAA,KAAA,IAAS,IAAI,CAAA,GAAI,IAAA,CAAK,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC3C,QAAA,IAAI,GAAG,CAAC,CAAA,GAAI,EAAA,CAAG,CAAA,GAAI,CAAC,CAAA,EAAG;AACnB,UAAA,MAAA,IAAU,MAAM,CAAC,CAAA;AAAA,QACrB,WAAW,EAAA,CAAG,CAAC,IAAI,EAAA,CAAG,CAAA,GAAI,CAAC,CAAA,EAAG;AAC1B,UAAA,MAAA,IAAU,MAAM,CAAC,CAAA;AAAA,QACrB;AAAA,MACJ;AAEA,MAAA,IAAI,WAAW,CAAA,EAAG;AACd,QAAA,OAAA,CAAQ,KAAK,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,KAAK,CAAA;AAAA,MACzC,CAAA,MAAO;AACH,QAAA,MAAM,UAAU,MAAA,GAAS,MAAA;AACzB,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAG,OAAO,GAAA,GAAM,GAAA,IAAO,CAAA,GAAI,OAAA,CAAA,EAAU,CAAA;AAAA,MAC/D;AAAA,IACJ;AAEA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEA,cAAc,QAAA,EAAyC;AACnD,IAAA,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,GAAA,EAAI;AAAA,EAC9B;AAAA,EAEA,OACI,GAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,EACA,YACA,aAAA,EACI;AACJ,IAAA,MAAM,UAAA,GAAc,GAAA,CAAI,MAAA,CAAwD,WAAA,IACzE,IAAI,MAAA,CAAO,KAAA;AAElB,IAAA,MAAM,QAAQ,aAAA,IAAiB,EAAE,GAAA,EAAK,CAAA,EAAG,KAAK,GAAA,EAAI;AAGlD,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,QAAA,CAAS,EAAA,EAAI,OAAO,UAAU,CAAA;AAChD,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,QAAA,CAAS,EAAA,EAAI,OAAO,UAAU,CAAA;AAEhD,IAAA,GAAA,CAAI,SAAA,GAAY,sBAAA;AAChB,IAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,UAAA,EAAY,GAAG,CAAA;AAElC,IAAA,GAAA,CAAI,SAAA,GAAY,uBAAA;AAChB,IAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,GAAA,EAAK,UAAA,EAAY,aAAa,GAAG,CAAA;AAGjD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,IAAA,GAAA,CAAI,WAAA,GAAc,wBAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,KAAA,MAAW,KAAA,IAAS,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA,EAAG;AAC9B,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,KAAA,EAAO,OAAO,UAAU,CAAA;AACjD,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AACf,MAAA,GAAA,CAAI,MAAA,CAAO,YAAY,CAAC,CAAA;AACxB,MAAA,GAAA,CAAI,MAAA,EAAO;AAAA,IACf;AACA,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,IAAA,GAAA,CAAI,OAAA,EAAQ;AAGZ,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,cAAc,IAAA,CAAK,KAAA;AACvB,IAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AACf,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,UAAU,IAAA,EAAM;AAAE,QAAA,OAAA,GAAU,KAAA;AAAO,QAAA;AAAA,MAAU;AACnD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,OAAO,UAAU,CAAA;AACnD,MAAA,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,OAAA,GAAU,IAAA,CAAA;AAAA,IAC/D;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AAAA,EACf;AACJ,CAAA;;;ACxGO,IAAM,MAAN,MAAgC;AAAA,EAMnC,WAAA,CACqB,MAAA,GAAiB,EAAA,EAClC,KAAA,GAAQ,SAAA,EACV;AAFmB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAJrB,IAAA,IAAA,CAAS,IAAA,GAAO,KAAA;AAChB,IAAA,IAAA,CAAS,UAAA,GAAa,EAAA;AAMlB,IAAA,IAAA,CAAK,IAAA,GAAO,KAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACjB;AAAA,EAEA,QAAQ,IAAA,EAAqC;AAEzC,IAAA,MAAM,GAAA,GAAgB,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK;AAChC,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,GAAA;AACzB,MAAA,MAAM,GAAA,GAAM,KAAA,KAAU,CAAA,GAAI,CAAA,GAAA,CAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,GAAA,IAAQ,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,KAAA,CAAA,IAAU,KAAA;AACzE,MAAA,OAAO,GAAA,IAAO,EAAE,MAAA,IAAU,CAAA,CAAA;AAAA,IAC9B,CAAC,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,MAAA,IAAI,CAAA,GAAI,KAAK,MAAA,GAAS,CAAA,SAAU,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,IAAA,EAAK;AAExD,MAAA,IAAI,MAAA,GAAS,CAAA;AACb,MAAA,IAAI,MAAA,GAAS,CAAA;AACb,MAAA,KAAA,IAAS,IAAI,CAAA,GAAI,IAAA,CAAK,SAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC3C,QAAA,MAAA,IAAU,IAAI,CAAC,CAAA;AACf,QAAA,MAAA,IAAU,IAAA,CAAK,CAAC,CAAA,CAAE,MAAA,IAAU,CAAA;AAAA,MAChC;AAEA,MAAA,MAAM,GAAA,GAAM,MAAA,KAAW,CAAA,GAAI,CAAA,GAAI,MAAA,GAAS,MAAA;AACxC,MAAA,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,GAAA,EAAI;AAAA,IAClC,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,cAAc,QAAA,EAAyC;AACnD,IAAA,OAAO,EAAE,GAAA,EAAK,EAAA,EAAI,GAAA,EAAK,CAAA,EAAE;AAAA,EAC7B;AAAA,EAEA,OACI,GAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,EACA,YACA,aAAA,EACI;AACJ,IAAA,MAAM,UAAA,GAAc,GAAA,CAAI,MAAA,CAAwD,WAAA,IACzE,IAAI,MAAA,CAAO,KAAA;AAElB,IAAA,MAAM,QAAQ,aAAA,IAAiB,EAAE,GAAA,EAAK,EAAA,EAAI,KAAK,CAAA,EAAE;AACjD,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,QAAA,CAAS,CAAA,EAAG,OAAO,UAAU,CAAA;AAGjD,IAAA,MAAM,GAAA,GAAO,KAAA,CAAM,QAAA,CAAS,GAAA,EAAM,OAAO,UAAU,CAAA;AACnD,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,CAAS,IAAA,EAAM,OAAO,UAAU,CAAA;AAEnD,IAAA,GAAA,CAAI,SAAA,GAAY,uBAAA;AAChB,IAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,UAAA,EAAY,GAAG,CAAA;AAElC,IAAA,GAAA,CAAI,SAAA,GAAY,sBAAA;AAChB,IAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,IAAA,EAAM,UAAA,EAAY,aAAa,IAAI,CAAA;AAGnD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,IAAA,GAAA,CAAI,WAAA,GAAc,wBAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,KAAA,MAAW,KAAA,IAAS,CAAC,GAAA,EAAK,CAAA,EAAG,IAAI,CAAA,EAAG;AAChC,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,KAAA,EAAO,OAAO,UAAU,CAAA;AACjD,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AACf,MAAA,GAAA,CAAI,MAAA,CAAO,YAAY,CAAC,CAAA;AACxB,MAAA,GAAA,CAAI,MAAA,EAAO;AAAA,IACf;AACA,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,IAAA,GAAA,CAAI,OAAA,EAAQ;AAGZ,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,CAAC,CAAA,GAAI,GAAG,CAAA;AACxE,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM;AACrB,MAAA,MAAM,IAAO,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACzD,MAAA,MAAM,OAAO,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,OAAO,UAAU,CAAA;AACtD,MAAA,MAAM,CAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,KAAK,CAAA;AAClC,MAAA,MAAM,GAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA;AACjC,MAAA,GAAA,CAAI,SAAA,GAAY,CAAA,CAAE,KAAA,IAAS,CAAA,GAAI,uBAAA,GAA0B,sBAAA;AACzD,MAAA,GAAA,CAAI,SAAS,CAAA,GAAI,KAAA,GAAQ,CAAA,EAAG,GAAA,EAAK,OAAO,CAAC,CAAA;AAAA,IAC7C;AAGA,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,cAAc,IAAA,CAAK,KAAA;AACvB,IAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AACf,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,UAAU,IAAA,EAAM;AAAE,QAAA,OAAA,GAAU,KAAA;AAAO,QAAA;AAAA,MAAU;AACnD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,OAAO,UAAU,CAAA;AACnD,MAAA,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,OAAA,GAAU,IAAA,CAAA;AAAA,IAC/D;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AAAA,EACf;AACJ,CAAA;;;AC1GO,IAAM,cAAN,MAAwC;AAAA,EAI7C,WAAA,CAAY,QAAQ,SAAA,EAAW;AAH/B,IAAA,IAAA,CAAS,IAAA,GAAO,OAAA;AAId,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,QAAQ,IAAA,EAAqC;AAC3C,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AACxB,MAAA,IAAI,CAAA,KAAM,CAAA,EAAG,OAAO,EAAE,OAAO,CAAA,EAAG,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,MAAM,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,WAAW,IAAA,EAAK;AAErG,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AACvB,MAAA,MAAM,MAAM,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,GAAA,GAAM,KAAK,KAAA,IAAS,CAAA;AACjD,MAAA,MAAM,EAAA,GAAK,CAAA,GAAI,EAAA,GAAK,IAAA,CAAK,GAAA;AACzB,MAAA,MAAM,EAAA,GAAK,CAAA,GAAI,EAAA,GAAK,IAAA,CAAK,IAAA;AACzB,MAAA,MAAM,EAAA,GAAK,EAAA,IAAM,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,GAAA,CAAA;AAClC,MAAA,MAAM,EAAA,GAAK,EAAA,IAAM,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,GAAA,CAAA;AAElC,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,CAAA;AAAA,QACP,KAAA,EAAO,EAAA;AAAA;AAAA,QACP,KAAA,EAAO,EAAA;AAAA;AAAA,QACP,KAAA,EAAO,EAAA;AAAA;AAAA,QACP,MAAA,EAAQ,EAAA;AAAA;AAAA,QACR,SAAA,EAAW;AAAA;AAAA,OACb;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAA,CACE,GAAA,EACA,OAAA,EACA,KAAA,EACA,UACA,WAAA,EACM;AACN,IAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,IAAA,MAAM,aAAa,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,MAAM,UAAA,GAAc,MAAA,CAAwD,WAAA,IAAe,GAAA,CAAI,MAAA,CAAO,KAAA;AAGtG,IAAA,IAAI,UAAA,GAAqC,IAAA;AACzC,IAAA,KAAA,IAAS,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC5C,MAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,KAAA,KAAU,IAAA,EAAM;AAC7B,QAAA,UAAA,GAAa,QAAQ,CAAC,CAAA;AACtB,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,eAAe,IAAA,EAAM;AAEzB,IAAA,MAAM,MAAA,GAAoF;AAAA,MACxF,EAAE,KAAA,EAAO,UAAA,CAAW,QAAW,KAAA,EAAO,IAAA,EAAM,OAAO,SAAA,EAAU;AAAA,MAC7D,EAAE,KAAA,EAAO,UAAA,CAAW,OAAW,KAAA,EAAO,IAAA,EAAM,OAAO,SAAA,EAAU;AAAA,MAC7D,EAAE,KAAA,EAAO,UAAA,CAAW,OAAW,KAAA,EAAO,IAAA,EAAM,OAAO,SAAA,EAAU;AAAA,MAC7D,EAAE,KAAA,EAAO,UAAA,CAAW,OAAW,KAAA,EAAO,IAAA,EAAM,OAAO,SAAA,EAAU;AAAA,MAC7D,EAAE,KAAA,EAAO,UAAA,CAAW,WAAW,KAAA,EAAO,IAAA,EAAM,OAAO,SAAA;AAAU,KAC/D;AAEA,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,GAAA,CAAI,IAAA,GAAO,iBAAA;AACX,IAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AAEnB,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,KAAA,CAAM,SAAS,IAAA,EAAM;AACzB,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,KAAA,EAAO,YAAY,WAAW,CAAA;AAG7D,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,cAAc,KAAA,CAAM,KAAA;AACxB,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AACf,MAAA,GAAA,CAAI,MAAA,CAAO,YAAY,CAAC,CAAA;AACxB,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAGlB,MAAA,GAAA,CAAI,YAAY,KAAA,CAAM,KAAA;AACtB,MAAA,GAAA,CAAI,SAAS,KAAA,CAAM,KAAA,EAAO,UAAA,GAAa,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,IAClD;AAAA,EACF;AACF,CAAA;;;ACpFA,IAAMC,WAAAA,GAAa,CAAC,CAAA,EAAG,KAAA,EAAO,OAAO,GAAA,EAAK,KAAA,EAAO,OAAO,CAAG,CAAA;AAC3D,IAAM,UAAA,GAAa,CAAC,IAAA,EAAM,OAAA,EAAS,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,MAAM,CAAA;AAC3E,IAAM,UAAA,GAAa,CAAC,SAAA,EAAW,SAAA,EAAW,WAAW,SAAA,EAAW,SAAA,EAAW,WAAW,SAAS,CAAA;AAExF,IAAM,0BAAN,MAAoD;AAAA,EAIzD,WAAA,CACmB,QAAA,GAAW,EAAA,EAC5B,KAAA,GAAQ,SAAA,EACR;AAFiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAJnB,IAAA,IAAA,CAAS,IAAA,GAAO,KAAA;AAOd,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,QAAQ,IAAA,EAAqC;AAC3C,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AACxB,MAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,IAAA,CAAK,WAAW,CAAC,CAAA;AAC/C,MAAA,IAAI,IAAA,GAAO,CAAA,QAAA;AACX,MAAA,IAAI,GAAA,GAAM,QAAA;AACV,MAAA,KAAA,IAAS,CAAA,GAAI,KAAA,EAAO,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC/B,QAAA,IAAI,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,GAAO,MAAM,IAAA,GAAO,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA;AACxC,QAAA,IAAI,IAAA,CAAK,CAAC,CAAA,CAAE,GAAA,GAAM,KAAK,GAAA,GAAM,IAAA,CAAK,CAAC,CAAA,CAAE,GAAA;AAAA,MACvC;AAEA,MAAA,MAAM,QAAQ,IAAA,GAAO,GAAA;AAErB,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,CAAA;AAAA,QACP,KAAA,EAAO,IAAA;AAAA;AAAA,QACP,KAAA,EAAO,MAAM,KAAA,GAAQ,KAAA;AAAA;AAAA,QACrB,KAAA,EAAO,MAAM,KAAA,GAAQ,KAAA;AAAA;AAAA,QACrB,MAAA,EAAQ,MAAM,GAAA,GAAM,KAAA;AAAA;AAAA,QACpB,SAAA,EAAW;AAAA;AAAA,OACb;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAA,CACE,GAAA,EACA,OAAA,EACA,KAAA,EACA,UACA,WAAA,EACM;AACN,IAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,IAAA,MAAM,aAAa,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,MAAM,UAAA,GAAc,MAAA,CAAwD,WAAA,IAAe,GAAA,CAAI,MAAA,CAAO,KAAA;AAGtG,IAAA,IAAI,UAAA,GAAqC,IAAA;AACzC,IAAA,KAAA,IAAS,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAC5C,MAAA,IAAI,OAAA,CAAQ,CAAC,CAAA,CAAE,KAAA,KAAU,IAAA,EAAM;AAC7B,QAAA,UAAA,GAAa,QAAQ,CAAC,CAAA;AACtB,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,eAAe,IAAA,EAAM;AAEzB,IAAA,MAAM,OAAO,UAAA,CAAW,KAAA;AACxB,IAAA,MAAM,MAAM,UAAA,CAAW,SAAA;AAEvB,IAAA,IAAI,IAAA,IAAQ,IAAA,IAAQ,GAAA,IAAO,IAAA,EAAM;AAEjC,IAAA,MAAM,QAAQ,IAAA,GAAO,GAAA;AAGrB,IAAA,MAAM,YAAYA,WAAAA,CAAW,GAAA,CAAI,CAAC,KAAA,KAAU,GAAA,GAAM,QAAQ,KAAK,CAAA;AAE/D,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,GAAA,CAAI,IAAA,GAAO,iBAAA;AACX,IAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AAEnB,IAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAKA,WAAAA,CAAW,QAAQ,EAAA,EAAA,EAAM;AAC7C,MAAA,MAAM,KAAA,GAAQ,UAAU,EAAE,CAAA;AAC1B,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,KAAA,EAAO,YAAY,WAAW,CAAA;AACvD,MAAA,MAAM,KAAA,GAAQ,WAAW,EAAE,CAAA;AAE3B,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,MAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AACf,MAAA,GAAA,CAAI,MAAA,CAAO,YAAY,CAAC,CAAA;AACxB,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAElB,MAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,MAAA,GAAA,CAAI,SAAS,UAAA,CAAW,EAAE,GAAG,UAAA,GAAa,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,IACrD;AAAA,EACF;AACF,CAAA;;;AC7FO,IAAM,aAAN,MAAuC;AAAA,EAI5C,YACmB,SAAA,GAAY,EAAA,EACZ,UAAA,GAAa,CAAA,EAC9B,QAAQ,SAAA,EACR;AAHiB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AALnB,IAAA,IAAA,CAAS,IAAA,GAAO,YAAA;AAQd,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,QAAQ,IAAA,EAAqC;AAC3C,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,IAAA,MAAM,UAA6B,EAAC;AAEpC,IAAA,IAAI,CAAA,KAAM,GAAG,OAAO,OAAA;AAGpB,IAAA,MAAM,KAAe,IAAI,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AACxC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA;AACrB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,CAAC,CAAA,CAAE,GAAA;AACpB,MAAA,MAAM,SAAA,GAAY,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,CAAE,KAAA,GAAQ,IAAA,CAAK,CAAC,CAAA,CAAE,KAAA;AACtD,MAAA,EAAA,CAAG,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,OAAO,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,SAAS,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,SAAS,CAAC,CAAA;AAAA,IACpF;AAGA,IAAA,MAAM,MAAgB,IAAI,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AACzC,IAAA,IAAI,CAAA,GAAI,KAAK,SAAA,EAAW;AACtB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,KAAK,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAC/E,MAAA,OAAO,OAAA;AAAA,IACT;AAGA,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,IAAA,CAAK,WAAW,CAAA,EAAA,EAAK,OAAA,IAAW,GAAG,CAAC,CAAA;AACxD,IAAA,GAAA,CAAI,IAAA,CAAK,SAAA,GAAY,CAAC,CAAA,GAAI,UAAU,IAAA,CAAK,SAAA;AAEzC,IAAA,KAAA,IAAS,CAAA,GAAI,IAAA,CAAK,SAAA,EAAW,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACvC,MAAA,GAAA,CAAI,CAAC,CAAA,GAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,IAAK,IAAA,CAAK,SAAA,GAAY,CAAA,CAAA,GAAK,EAAA,CAAG,CAAC,CAAA,IAAK,IAAA,CAAK,SAAA;AAAA,IAC9D;AAGA,IAAA,MAAM,iBAA2B,IAAI,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AACpD,IAAA,MAAM,iBAA2B,IAAI,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AAEpD,IAAA,MAAM,YAAsB,IAAI,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AAE/C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,MAAA,IAAI,CAAA,GAAI,IAAA,CAAK,SAAA,GAAY,CAAA,EAAG;AAC1B,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAG,OAAO,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AACnD,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,GAAA,GAAA,CAAO,KAAK,CAAC,CAAA,CAAE,OAAO,IAAA,CAAK,CAAC,EAAE,GAAA,IAAO,CAAA;AAC3C,MAAA,MAAM,UAAA,GAAa,GAAA,GAAM,IAAA,CAAK,UAAA,GAAa,IAAI,CAAC,CAAA;AAChD,MAAA,MAAM,UAAA,GAAa,GAAA,GAAM,IAAA,CAAK,UAAA,GAAa,IAAI,CAAC,CAAA;AAEhD,MAAA,IAAI,CAAA,KAAM,IAAA,CAAK,SAAA,GAAY,CAAA,EAAG;AAC5B,QAAA,cAAA,CAAe,CAAC,CAAA,GAAI,UAAA;AACpB,QAAA,cAAA,CAAe,CAAC,CAAA,GAAI,UAAA;AACpB,QAAA,SAAA,CAAU,CAAC,CAAA,GAAI,CAAA;AACf,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,eAAe,CAAC,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,CAAA;AAC7D,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,CAAE,KAAA;AAG9B,MAAA,cAAA,CAAe,CAAC,CAAA,GACd,UAAA,GAAa,cAAA,CAAe,IAAI,CAAC,CAAA,IAAK,SAAA,GAAY,cAAA,CAAe,IAAI,CAAC,CAAA,GAClE,UAAA,GACA,cAAA,CAAe,IAAI,CAAC,CAAA;AAG1B,MAAA,cAAA,CAAe,CAAC,CAAA,GACd,UAAA,GAAa,cAAA,CAAe,IAAI,CAAC,CAAA,IAAK,SAAA,GAAY,cAAA,CAAe,IAAI,CAAC,CAAA,GAClE,UAAA,GACA,cAAA,CAAe,IAAI,CAAC,CAAA;AAG1B,MAAA,IAAI,SAAA,CAAU,CAAA,GAAI,CAAC,CAAA,KAAM,EAAA,EAAI;AAC3B,QAAA,SAAA,CAAU,CAAC,IAAI,IAAA,CAAK,CAAC,EAAE,KAAA,GAAQ,cAAA,CAAe,CAAC,CAAA,GAAI,CAAA,GAAI,EAAA;AAAA,MACzD,CAAA,MAAO;AACL,QAAA,SAAA,CAAU,CAAC,IAAI,IAAA,CAAK,CAAC,EAAE,KAAA,GAAQ,cAAA,CAAe,CAAC,CAAA,GAAI,EAAA,GAAK,CAAA;AAAA,MAC1D;AAEA,MAAA,MAAM,aAAA,GAAgB,UAAU,CAAC,CAAA,KAAM,IAAI,cAAA,CAAe,CAAC,CAAA,GAAI,cAAA,CAAe,CAAC,CAAA;AAC/E,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,eAAe,KAAA,EAAO,SAAA,CAAU,CAAC,CAAA,EAAG,CAAA;AAAA,IACtE;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAA,CACE,GAAA,EACA,OAAA,EACA,KAAA,EACA,UACA,WAAA,EACM;AACN,IAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,IAAA,MAAM,aAAa,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,MAAM,UAAA,GAAc,MAAA,CAAwD,WAAA,IAAe,GAAA,CAAI,MAAA,CAAO,KAAA;AACtG,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AAEf,IAAA,MAAM,aAAA,GAAgB,SAAA;AACtB,IAAA,MAAM,aAAA,GAAgB,SAAA;AAEtB,IAAA,IAAI,aAAA,GAA+B,IAAA;AAGnC,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,WAAA,GAAc,aAAA;AAClB,IAAA,IAAI,WAAA,GAAc,KAAA;AAElB,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAA,CAAE,KAAA,IAAS,IAAA,IAAQ,CAAA,CAAE,SAAS,IAAA,EAAM;AAAE,QAAA,WAAA,GAAc,KAAA;AAAO,QAAA;AAAA,MAAU;AACzE,MAAA,MAAM,SAAA,GAAY,EAAE,KAAA,IAAS,CAAA;AAC7B,MAAA,IAAI,CAAC,SAAA,EAAW;AAAE,QAAA,WAAA,GAAc,KAAA;AAAO,QAAA;AAAA,MAAU;AACjD,MAAA,IAAI,aAAA,KAAkB,GAAG,WAAA,GAAc,KAAA;AACvC,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,WAAW,CAAA;AACzD,MAAA,WAAA,GAAc,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,WAAA,GAAc,IAAA,CAAA;AACnE,MAAA,aAAA,GAAgB,CAAA;AAAA,IAClB;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AAGX,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,WAAA,GAAc,aAAA;AAClB,IAAA,IAAI,WAAA,GAAc,KAAA;AAClB,IAAA,aAAA,GAAgB,IAAA;AAEhB,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAA,CAAE,KAAA,IAAS,IAAA,IAAQ,CAAA,CAAE,SAAS,IAAA,EAAM;AAAE,QAAA,WAAA,GAAc,KAAA;AAAO,QAAA;AAAA,MAAU;AACzE,MAAA,MAAM,SAAA,GAAY,EAAE,KAAA,GAAQ,CAAA;AAC5B,MAAA,IAAI,CAAC,SAAA,EAAW;AAAE,QAAA,WAAA,GAAc,KAAA;AAAO,QAAA;AAAA,MAAU;AACjD,MAAA,IAAI,aAAA,KAAkB,IAAI,WAAA,GAAc,KAAA;AACxC,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,WAAW,CAAA;AACzD,MAAA,WAAA,GAAc,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,WAAA,GAAc,IAAA,CAAA;AACnE,MAAA,aAAA,GAAgB,EAAA;AAAA,IAClB;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AAAA,EACb;AACF,CAAA;;;ACtJO,IAAM,eAAN,MAAyC;AAAA,EAI9C,YACmB,IAAA,GAAO,IAAA,EACP,KAAA,GAAQ,GAAA,EACzB,QAAQ,SAAA,EACR;AAHiB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AALnB,IAAA,IAAA,CAAS,IAAA,GAAO,MAAA;AAQd,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,QAAQ,IAAA,EAAqC;AAC3C,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,IAAA,MAAM,UAA6B,EAAC;AAEpC,IAAA,IAAI,IAAI,CAAA,EAAG;AACT,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,KAAK,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAC/E,MAAA,OAAO,OAAA;AAAA,IACT;AAGA,IAAA,IAAI,OAAA,GAAU,IAAA;AACd,IAAA,IAAI,KAAK,IAAA,CAAK,IAAA;AACd,IAAA,IAAI,EAAA,GAAK,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA;AACjB,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,CAAC,CAAA,CAAE,GAAA;AAElB,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAG,OAAO,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAEnD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAE1B,MAAA,IAAI,MAAA,GAAS,GAAA,GAAM,EAAA,IAAM,EAAA,GAAK,GAAA,CAAA;AAE9B,MAAA,IAAI,OAAA,EAAS;AAEX,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,CAAE,GAAA;AAC5B,QAAA,MAAM,WAAA,GAAc,CAAA,IAAK,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,CAAE,GAAA,GAAM,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,CAAE,GAAA;AAC3D,QAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,OAAA,EAAS,WAAW,CAAA;AAG9C,QAAA,IAAI,MAAA,GAAS,IAAA,CAAK,CAAC,CAAA,CAAE,GAAA,EAAK;AAExB,UAAA,OAAA,GAAU,KAAA;AACV,UAAA,MAAA,GAAS,EAAA;AACT,UAAA,EAAA,GAAK,IAAA,CAAK,CAAC,CAAA,CAAE,GAAA;AACb,UAAA,EAAA,GAAK,IAAA,CAAK,IAAA;AAAA,QACZ,CAAA,MAAO;AAEL,UAAA,IAAI,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,GAAO,EAAA,EAAI;AACrB,YAAA,EAAA,GAAK,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA;AACb,YAAA,EAAA,GAAK,KAAK,GAAA,CAAI,EAAA,GAAK,IAAA,CAAK,IAAA,EAAM,KAAK,KAAK,CAAA;AAAA,UAC1C;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,CAAE,IAAA;AAC7B,QAAA,MAAM,YAAA,GAAe,CAAA,IAAK,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,CAAE,IAAA,GAAO,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,CAAE,IAAA;AAC7D,QAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,QAAA,EAAU,YAAY,CAAA;AAGhD,QAAA,IAAI,MAAA,GAAS,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,EAAM;AAEzB,UAAA,OAAA,GAAU,IAAA;AACV,UAAA,MAAA,GAAS,EAAA;AACT,UAAA,EAAA,GAAK,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA;AACb,UAAA,EAAA,GAAK,IAAA,CAAK,IAAA;AAAA,QACZ,CAAA,MAAO;AAEL,UAAA,IAAI,IAAA,CAAK,CAAC,CAAA,CAAE,GAAA,GAAM,EAAA,EAAI;AACpB,YAAA,EAAA,GAAK,IAAA,CAAK,CAAC,CAAA,CAAE,GAAA;AACb,YAAA,EAAA,GAAK,KAAK,GAAA,CAAI,EAAA,GAAK,IAAA,CAAK,IAAA,EAAM,KAAK,KAAK,CAAA;AAAA,UAC1C;AAAA,QACF;AAAA,MACF;AAEA,MAAA,GAAA,GAAM,MAAA;AAEN,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,KAAK,KAAA,EAAO,OAAA,GAAU,CAAA,GAAI,EAAA,EAAI,CAAA;AAAA,IAChE;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAA,CACE,GAAA,EACA,OAAA,EACA,KAAA,EACA,UACA,WAAA,EACM;AACN,IAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,IAAA,MAAM,aAAa,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,MAAM,UAAA,GAAc,MAAA,CAAwD,WAAA,IAAe,GAAA,CAAI,MAAA,CAAO,KAAA;AACtG,IAAA,MAAM,aAAA,GAAgB,SAAA;AACtB,IAAA,MAAM,aAAA,GAAgB,SAAA;AAEtB,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAA,CAAE,KAAA,IAAS,IAAA,IAAQ,CAAA,CAAE,SAAS,IAAA,EAAM;AACxC,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,WAAW,CAAA;AAEzD,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,IAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AAC/B,MAAA,GAAA,CAAI,SAAA,GAAY,CAAA,CAAE,KAAA,IAAS,CAAA,GAAI,aAAA,GAAgB,aAAA;AAC/C,MAAA,GAAA,CAAI,IAAA,EAAK;AAAA,IACX;AAAA,EACF;AACF,CAAA;;;AC7GA,SAAS,aAAA,CAAc,IAAA,EAAkB,KAAA,EAAe,MAAA,EAAsD;AAC5G,EAAA,IAAI,KAAA,GAAQ,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AAC/B,EAAA,IAAI,IAAA,GAAO,CAAA,QAAA;AACX,EAAA,IAAI,GAAA,GAAM,QAAA;AACV,EAAA,KAAA,IAAS,IAAI,KAAA,GAAQ,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,OAAO,CAAA,EAAA,EAAK;AAChD,IAAA,IAAI,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,GAAO,MAAM,IAAA,GAAO,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA;AACxC,IAAA,IAAI,IAAA,CAAK,CAAC,CAAA,CAAE,GAAA,GAAM,KAAK,GAAA,GAAM,IAAA,CAAK,CAAC,CAAA,CAAE,GAAA;AAAA,EACvC;AACA,EAAA,OAAO,EAAE,MAAM,GAAA,EAAI;AACrB;AAEO,IAAM,gBAAN,MAA0C;AAAA,EAI/C,WAAA,CACmB,eAAe,CAAA,EACf,WAAA,GAAc,IACd,aAAA,GAAgB,EAAA,EACjC,QAAQ,SAAA,EACR;AAJiB,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AACA,IAAA,IAAA,CAAA,aAAA,GAAA,aAAA;AANnB,IAAA,IAAA,CAAS,IAAA,GAAO,UAAA;AASd,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,QAAQ,IAAA,EAAqC;AAC3C,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,KAAM;AAE1B,MAAA,MAAM,QAAA,GAAW,aAAA,CAAc,IAAA,EAAM,CAAA,EAAG,KAAK,YAAY,CAAA;AACzD,MAAA,MAAM,SAAS,QAAA,KAAa,IAAA,GAAA,CAAQ,SAAS,IAAA,GAAO,QAAA,CAAS,OAAO,CAAA,GAAI,IAAA;AAGxE,MAAA,MAAM,OAAA,GAAU,aAAA,CAAc,IAAA,EAAM,CAAA,EAAG,KAAK,WAAW,CAAA;AACvD,MAAA,MAAM,QAAQ,OAAA,KAAY,IAAA,GAAA,CAAQ,QAAQ,IAAA,GAAO,OAAA,CAAQ,OAAO,CAAA,GAAI,IAAA;AAGpE,MAAA,MAAM,QAAQ,MAAA,KAAW,IAAA,IAAQ,UAAU,IAAA,GAAA,CAAQ,MAAA,GAAS,SAAS,CAAA,GAAI,IAAA;AAGzE,MAAA,MAAM,OAAA,GAAU,aAAA,CAAc,IAAA,EAAM,CAAA,EAAG,KAAK,aAAa,CAAA;AACzD,MAAA,MAAM,QAAQ,OAAA,KAAY,IAAA,GAAA,CAAQ,QAAQ,IAAA,GAAO,OAAA,CAAQ,OAAO,CAAA,GAAI,IAAA;AAIpE,MAAA,MAAM,SAAS,GAAA,CAAI,KAAA;AAEnB,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,CAAA;AAAA,QACP,KAAA,EAAO,MAAA;AAAA,QACP,KAAA,EAAO,KAAA;AAAA,QACP,KAAA,EAAO,KAAA;AAAA,QACP,MAAA,EAAQ,KAAA;AAAA,QACR,SAAA,EAAW;AAAA,OACb;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAA,CACE,GAAA,EACA,OAAA,EACA,KAAA,EACA,UACA,WAAA,EACM;AACN,IAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,IAAA,MAAM,aAAa,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,MAAM,UAAA,GAAc,MAAA,CAAwD,WAAA,IAAe,GAAA,CAAI,MAAA,CAAO,KAAA;AACtG,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AAEf,IAAA,MAAM,QAAA,GAAW,CACf,QAAA,EACA,KAAA,EACA,OAAO,KAAA,KACJ;AACH,MAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,MAAA,IAAI,MAAM,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AAChC,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,IAAIC,QAAAA,GAAU,KAAA;AACd,MAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,QAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AACtB,QAAA,IAAI,OAAO,IAAA,EAAM;AAAE,UAAAA,QAAAA,GAAU,KAAA;AAAO,UAAA;AAAA,QAAU;AAC9C,QAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,QAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,GAAA,EAAK,YAAY,WAAW,CAAA;AACrD,QAAAA,QAAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAIA,QAAAA,GAAU,IAAA,CAAA;AAAA,MAC7D;AACA,MAAA,GAAA,CAAI,MAAA,EAAO;AACX,MAAA,IAAI,IAAA,EAAM,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAAA,IAC9B,CAAA;AAGA,IAAA,MAAM,cAAkC,EAAC;AACzC,IAAA,MAAM,cAAkC,EAAC;AAEzC,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAA,CAAE,KAAA,IAAS,IAAA,IAAQ,CAAA,CAAE,UAAU,IAAA,EAAM;AACzC,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,EAAG,KAAA,CAAM,QAAA,CAAS,EAAE,KAAA,EAAO,UAAA,EAAY,WAAW,CAAC,CAAC,CAAA;AACtE,MAAA,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,EAAG,KAAA,CAAM,QAAA,CAAS,EAAE,MAAA,EAAQ,UAAA,EAAY,WAAW,CAAC,CAAC,CAAA;AAAA,IACzE;AAGA,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK;AAC/C,MAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,YAAY,CAAC,CAAA;AAC9B,MAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,WAAA,CAAY,IAAI,CAAC,CAAA;AAClC,MAAA,MAAM,GAAG,EAAE,CAAA,GAAI,YAAY,CAAC,CAAA;AAC5B,MAAA,MAAM,GAAG,EAAE,CAAA,GAAI,WAAA,CAAY,IAAI,CAAC,CAAA;AAKhC,MAAA,MAAM,aAAa,EAAA,GAAK,EAAA;AACxB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,MAAA,CAAO,IAAI,EAAE,CAAA;AACjB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,SAAA,GAAY,aACZ,0BAAA,GACA,yBAAA;AACJ,MAAA,GAAA,CAAI,IAAA,EAAK;AAAA,IACX;AAGA,IAAA,QAAA,CAAS,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,EAAO,WAAW,IAAI,CAAA;AAGxC,IAAA,QAAA,CAAS,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,EAAQ,WAAW,IAAI,CAAA;AAGzC,IAAA,QAAA,CAAS,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,EAAO,SAAS,CAAA;AAGlC,IAAA,QAAA,CAAS,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,EAAO,SAAS,CAAA;AAGlC,IAAA,GAAA,CAAI,WAAA,GAAc,SAAA;AAClB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAA,CAAE,aAAa,IAAA,EAAM;AAAE,QAAA,OAAA,GAAU,KAAA;AAAO,QAAA;AAAA,MAAU;AACtD,MAAA,MAAM,YAAA,GAAe,CAAA,CAAE,KAAA,GAAQ,IAAA,CAAK,WAAA;AACpC,MAAA,IAAI,eAAe,CAAA,EAAG;AAAE,QAAA,OAAA,GAAU,KAAA;AAAO,QAAA;AAAA,MAAU;AACnD,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,YAAA,EAAc,UAAU,UAAU,CAAA;AAC3D,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,SAAA,EAAW,YAAY,WAAW,CAAA;AAC7D,MAAA,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,OAAA,GAAU,IAAA,CAAA;AAAA,IAC7D;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AAAA,EACb;AACF,CAAA;;;ACvJO,IAAM,MAAN,MAAgC;AAAA,EAMnC,WAAA,CACqB,MAAA,GAAiB,EAAA,EAClC,KAAA,GAAQ,SAAA,EACV;AAFmB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAJrB,IAAA,IAAA,CAAS,IAAA,GAAO,KAAA;AAChB,IAAA,IAAA,CAAS,UAAA,GAAa,EAAA;AAMlB,IAAA,IAAA,CAAK,IAAA,GAAO,KAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACjB;AAAA,EAEA,QAAQ,IAAA,EAAqC;AACzC,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,IAAA,IAAI,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AACrB,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,MAAK,CAAE,CAAA;AAAA,IACnF;AAGA,IAAA,MAAM,KAAgB,IAAI,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AACzC,IAAA,MAAM,MAAgB,IAAI,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AACzC,IAAA,MAAM,MAAgB,IAAI,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AAEzC,IAAA,EAAA,CAAG,CAAC,IAAK,IAAA,CAAK,CAAC,EAAE,IAAA,GAAO,IAAA,CAAK,CAAC,CAAA,CAAE,GAAA;AAChC,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AACT,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAET,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,CAAE,KAAA;AAC9B,MAAA,MAAM,QAAA,GAAY,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,CAAE,IAAA;AAC9B,MAAA,MAAM,OAAA,GAAY,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,CAAE,GAAA;AAC9B,MAAA,MAAM,QAAA,GAAY,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA;AAC1B,MAAA,MAAM,OAAA,GAAY,IAAA,CAAK,CAAC,CAAA,CAAE,GAAA;AAE1B,MAAA,EAAA,CAAG,CAAC,IAAI,IAAA,CAAK,GAAA;AAAA,QACT,QAAA,GAAW,OAAA;AAAA,QACX,IAAA,CAAK,GAAA,CAAI,QAAA,GAAW,SAAS,CAAA;AAAA,QAC7B,IAAA,CAAK,GAAA,CAAI,OAAA,GAAW,SAAS;AAAA,OACjC;AAEA,MAAA,MAAM,SAAW,QAAA,GAAW,QAAA;AAC5B,MAAA,MAAM,WAAW,OAAA,GAAW,OAAA;AAE5B,MAAA,GAAA,CAAI,CAAC,CAAA,GAAK,MAAA,GAAS,QAAA,IAAY,MAAA,GAAS,IAAK,MAAA,GAAW,CAAA;AACxD,MAAA,GAAA,CAAI,CAAC,CAAA,GAAK,QAAA,GAAW,MAAA,IAAU,QAAA,GAAW,IAAK,QAAA,GAAW,CAAA;AAAA,IAC9D;AAGA,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAClC,MAAA,QAAA,IAAY,GAAG,CAAC,CAAA;AAChB,MAAA,QAAA,IAAY,IAAI,CAAC,CAAA;AACjB,MAAA,QAAA,IAAY,IAAI,CAAC,CAAA;AAAA,IACrB;AAEA,IAAA,MAAM,UAA6B,EAAC;AAGpC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAClC,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,MAAM,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,CAAA;AAAA,IACpE;AAMA,IAAA,MAAM,SAAmB,IAAI,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AAC5C,IAAA,MAAM,SAAmB,IAAI,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AAC5C,IAAA,MAAM,QAAmB,IAAI,KAAA,CAAM,CAAC,CAAA,CAAE,KAAK,CAAC,CAAA;AAG5C,IAAA,MAAM,IAAA,GAAO,QAAA,KAAa,CAAA,GAAI,CAAA,GAAI,MAAM,QAAA,GAAW,QAAA;AACnD,IAAA,MAAM,IAAA,GAAO,QAAA,KAAa,CAAA,GAAI,CAAA,GAAI,MAAM,QAAA,GAAW,QAAA;AACnD,IAAA,MAAM,GAAA,GAAQ,IAAA,GAAO,IAAA,KAAS,CAAA,GAAK,CAAA,GAAI,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,IAAI,CAAA,IAAK,IAAA,GAAO,IAAA,CAAA;AAE7E,IAAA,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,GAAI,IAAA;AAC1B,IAAA,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,GAAI,IAAA;AAC1B,IAAA,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,GAAK,GAAA;AAG1B,IAAA,OAAA,CAAQ,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,GAAI;AAAA,MACvB,KAAA,EAAO,KAAK,MAAA,GAAS,CAAA;AAAA,MACrB,KAAA,EAAO,IAAA;AAAA;AAAA,MACP,KAAA,EAAO,IAAA;AAAA,MACP,KAAA,EAAO;AAAA,KACX;AAGA,IAAA,KAAA,IAAS,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AAClC,MAAA,QAAA,GAAW,QAAA,GAAW,QAAA,GAAW,IAAA,CAAK,MAAA,GAAS,GAAG,CAAC,CAAA;AACnD,MAAA,QAAA,GAAW,QAAA,GAAW,QAAA,GAAW,IAAA,CAAK,MAAA,GAAS,IAAI,CAAC,CAAA;AACpD,MAAA,QAAA,GAAW,QAAA,GAAW,QAAA,GAAW,IAAA,CAAK,MAAA,GAAS,IAAI,CAAC,CAAA;AAEpD,MAAA,MAAM,GAAA,GAAM,QAAA,KAAa,CAAA,GAAI,CAAA,GAAI,MAAM,QAAA,GAAW,QAAA;AAClD,MAAA,MAAM,GAAA,GAAM,QAAA,KAAa,CAAA,GAAI,CAAA,GAAI,MAAM,QAAA,GAAW,QAAA;AAClD,MAAA,MAAM,EAAA,GAAO,GAAA,GAAM,GAAA,KAAQ,CAAA,GAAK,CAAA,GAAI,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,GAAG,CAAA,IAAK,GAAA,GAAM,GAAA,CAAA;AAEvE,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,GAAA;AACZ,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,GAAA;AACZ,MAAA,KAAA,CAAM,CAAC,CAAA,GAAK,EAAA;AAEZ,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,MAAM,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,GAAA,EAAK,CAAA;AAAA,IAClE;AAIA,IAAA,MAAM,QAAA,GAAW,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA;AAGnC,IAAA,IAAI,QAAA,IAAY,GAAG,OAAO,OAAA;AAE1B,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,KAAA,IAAS,IAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,UAAU,CAAA,EAAA,EAAK;AAC9C,MAAA,GAAA,IAAO,MAAM,CAAC,CAAA;AAAA,IAClB;AACA,IAAA,GAAA,IAAQ,IAAA,CAAK,MAAA;AAEb,IAAA,OAAA,CAAQ,QAAQ,EAAE,KAAA,GAAQ,GAAA;AAE1B,IAAA,KAAA,IAAS,CAAA,GAAI,QAAA,GAAW,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAA,EAAK;AACnC,MAAA,GAAA,GAAA,CAAO,OAAO,IAAA,CAAK,MAAA,GAAS,KAAK,KAAA,CAAM,CAAC,KAAK,IAAA,CAAK,MAAA;AAClD,MAAA,OAAA,CAAQ,CAAC,EAAE,KAAA,GAAQ,GAAA;AAAA,IACvB;AAEA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEA,cAAc,QAAA,EAAyC;AACnD,IAAA,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,GAAA,EAAI;AAAA,EAC9B;AAAA,EAEA,OACI,GAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,EACA,YACA,aAAA,EACI;AACJ,IAAA,MAAM,UAAA,GAAc,GAAA,CAAI,MAAA,CAAwD,WAAA,IACzE,IAAI,MAAA,CAAO,KAAA;AAElB,IAAA,MAAM,QAAQ,aAAA,IAAiB,EAAE,GAAA,EAAK,CAAA,EAAG,KAAK,GAAA,EAAI;AAGlD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,IAAA,GAAA,CAAI,WAAA,GAAc,wBAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,QAAA,CAAS,EAAA,EAAI,OAAO,UAAU,CAAA;AAChD,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,GAAG,CAAA;AACjB,IAAA,GAAA,CAAI,MAAA,CAAO,YAAY,GAAG,CAAA;AAC1B,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,IAAA,GAAA,CAAI,OAAA,EAAQ;AAGZ,IAAA,MAAM,QAAA,GAAW,CACb,QAAA,EACA,WAAA,EACA,SAAA,KACC;AACD,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,WAAA,GAAc,WAAA;AAClB,MAAA,GAAA,CAAI,SAAA,GAAY,SAAA;AAChB,MAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AACf,MAAA,IAAI,OAAA,GAAU,KAAA;AACd,MAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,QAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AACtB,QAAA,IAAI,OAAO,IAAA,EAAM;AAAE,UAAA,OAAA,GAAU,KAAA;AAAO,UAAA;AAAA,QAAU;AAC9C,QAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,QAAA,MAAM,CAAA,GAAI,KAAA,CAAM,QAAA,CAAS,GAAA,EAAK,OAAO,UAAU,CAAA;AAC/C,QAAA,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,OAAA,GAAU,IAAA,CAAA;AAAA,MAC/D;AACA,MAAA,GAAA,CAAI,MAAA,EAAO;AAAA,IACf,CAAA;AAGA,IAAA,QAAA,CAAS,CAAA,CAAA,KAAK,CAAA,CAAE,KAAA,EAAO,SAAA,EAAW,CAAC,CAAA;AAEnC,IAAA,QAAA,CAAS,CAAA,CAAA,KAAK,CAAA,CAAE,KAAA,EAAO,SAAA,EAAW,CAAC,CAAA;AAEnC,IAAA,QAAA,CAAS,CAAA,CAAA,KAAK,CAAA,CAAE,KAAA,EAAO,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,EAE1C;AACJ,CAAA;;;AC9LO,IAAM,oBAAN,MAA8C;AAAA,EAMjD,YACqB,UAAA,GAAa,CAAA,EACb,UAAA,GAAa,EAAA,EAC9B,QAAQ,SAAA,EACV;AAHmB,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACA,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAPrB,IAAA,IAAA,CAAS,IAAA,GAAO,IAAA;AAEhB,IAAA,IAAA,CAAS,IAAA,GAAO,KAAA;AAChB,IAAA,IAAA,CAAS,UAAA,GAAa,EAAA;AAOlB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACjB;AAAA,EAEA,QAAQ,IAAA,EAAqC;AAEzC,IAAA,MAAM,GAAA,GAAgB,KAAK,GAAA,CAAI,CAAA,CAAA,KAAA,CAAM,EAAE,IAAA,GAAO,CAAA,CAAE,OAAO,CAAC,CAAA;AAGxD,IAAA,MAAM,GAAA,GAAM,CAAC,GAAA,EAAe,GAAA,EAAa,MAAA,KAAkC;AACvE,MAAA,IAAI,GAAA,GAAM,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AAC7B,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,KAAA,IAAS,CAAA,GAAI,MAAM,MAAA,GAAS,CAAA,EAAG,KAAK,GAAA,EAAK,CAAA,EAAA,EAAK,GAAA,IAAO,GAAA,CAAI,CAAC,CAAA;AAC1D,MAAA,OAAO,GAAA,GAAM,MAAA;AAAA,IACjB,CAAA;AAEA,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,EAAK,CAAA,EAAG,KAAK,UAAU,CAAA;AACxC,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,EAAK,CAAA,EAAG,KAAK,UAAU,CAAA;AACxC,MAAA,IAAI,IAAA,KAAS,QAAQ,IAAA,KAAS,IAAA,SAAa,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,IAAA,EAAK;AACnE,MAAA,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,OAAO,IAAA,EAAK;AAAA,IAC1C,CAAC,CAAA;AAAA,EACL;AAAA,EAEA,cAAc,OAAA,EAAwC;AAClD,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,KAAA,IAAS,IAAA,EAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IACpE;AACA,IAAA,OAAO,EAAE,GAAA,EAAK,CAAC,SAAS,GAAA,EAAK,GAAA,EAAK,SAAS,GAAA,EAAI;AAAA,EACnD;AAAA,EAEA,OACI,GAAA,EACA,OAAA,EACA,KAAA,EACA,QAAA,EACA,YACA,aAAA,EACI;AACJ,IAAA,MAAM,UAAA,GAAc,GAAA,CAAI,MAAA,CAAwD,WAAA,IACzE,IAAI,MAAA,CAAO,KAAA;AAGlB,IAAA,IAAI,MAAA,GAAS,IAAA;AACb,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,KAAA,IAAS,IAAA,EAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IACpE;AACA,IAAA,MAAM,KAAA,GAAQ,iBAAiB,EAAE,GAAA,EAAK,CAAC,MAAA,GAAS,GAAA,EAAK,GAAA,EAAK,MAAA,GAAS,GAAA,EAAI;AACvE,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,QAAA,CAAS,CAAA,EAAG,OAAO,UAAU,CAAA;AAGjD,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,IAAA,GAAA,CAAI,WAAA,GAAc,wBAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAO,GAAG,KAAK,CAAA;AACnB,IAAA,GAAA,CAAI,MAAA,CAAO,YAAY,KAAK,CAAA;AAC5B,IAAA,GAAA,CAAI,MAAA,EAAO;AACX,IAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAClB,IAAA,GAAA,CAAI,OAAA,EAAQ;AAGZ,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,KAAA,CAAM,gBAAgB,QAAA,EAAU,UAAU,GAAG,CAAC,CAAA;AACrE,IAAA,IAAI,SAAA,GAA2B,IAAA;AAE/B,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,SAAS,IAAA,EAAM;AAAE,QAAA,SAAA,GAAY,IAAA;AAAM,QAAA;AAAA,MAAU;AAEnD,MAAA,MAAM,OAAA,GAAU,SAAA,KAAc,IAAA,GAAO,IAAA,GAAO,EAAE,KAAA,IAAS,SAAA;AACvD,MAAA,MAAM,IAAO,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACzD,MAAA,MAAM,OAAO,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,OAAO,UAAU,CAAA;AACtD,MAAA,MAAM,CAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,KAAK,CAAA;AAClC,MAAA,MAAM,GAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA;AAEjC,MAAA,GAAA,CAAI,SAAA,GAAY,UAAU,uBAAA,GAA0B,sBAAA;AACpD,MAAA,GAAA,CAAI,SAAS,CAAA,GAAI,KAAA,GAAQ,CAAA,EAAG,GAAA,EAAK,OAAO,CAAC,CAAA;AAEzC,MAAA,SAAA,GAAY,CAAA,CAAE,KAAA;AAAA,IAClB;AAAA,EAEJ;AACJ,CAAA;;;AC7FO,IAAM,aAAN,MAAuC;AAAA,EAM5C,YAAY,KAAA,GAAQ,SAAA,EAAW,OAAA,GAAU,SAAA,EAAW,YAAY,SAAA,EAAW;AAL3E,IAAA,IAAA,CAAS,IAAA,GAAO,IAAA;AAMd,IAAA,IAAA,CAAK,KAAA,GAAW,KAAA;AAChB,IAAA,IAAA,CAAK,OAAA,GAAW,OAAA;AAChB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAAA,EAEA,QAAQ,IAAA,EAAqC;AAC3C,IAAA,MAAM,UAA6B,EAAC;AACpC,IAAA,IAAI,UAAA,GAAa,CAAA;AACjB,IAAA,IAAI,WAAA,GAAc,CAAA;AAElB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAElB,MAAA,MAAM,OAAA,GAAA,CAAW,IAAI,IAAA,GAAO,GAAA,CAAI,OAAO,GAAA,CAAI,GAAA,GAAM,IAAI,KAAA,IAAS,CAAA;AAE9D,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI,MAAM,CAAA,EAAG;AACX,QAAA,MAAA,GAAA,CAAU,GAAA,CAAI,IAAA,GAAO,GAAA,CAAI,KAAA,IAAS,CAAA;AAAA,MACpC,CAAA,MAAO;AACL,QAAA,MAAA,GAAA,CAAU,aAAa,WAAA,IAAe,CAAA;AAAA,MACxC;AAEA,MAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,QAAQ,OAAO,CAAA;AACjD,MAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,QAAQ,OAAO,CAAA;AAE/C,MAAA,UAAA,GAAa,MAAA;AACb,MAAA,WAAA,GAAc,OAAA;AAEd,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,KAAA,EAAO,CAAA;AAAA,QACP,KAAA,EAAO,OAAA;AAAA;AAAA,QACP,KAAA,EAAO,MAAA;AAAA;AAAA,QACP,KAAA,EAAO,KAAA;AAAA;AAAA,QACP,MAAA,EAAQ;AAAA;AAAA,OACT,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAA,CACE,GAAA,EACA,OAAA,EACA,KAAA,EACA,UACA,WAAA,EACM;AACN,IAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,IAAA,MAAM,aAAa,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,MAAM,UAAA,GAAc,MAAA,CAAwD,WAAA,IAAe,GAAA,CAAI,MAAA,CAAO,KAAA;AACtG,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,eAAA,CAAgB,QAAA,EAAU,UAAU,CAAA;AAC9D,IAAA,MAAM,WAAW,WAAA,GAAc,CAAA;AAE/B,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAA,CAAE,KAAA,IAAS,IAAA,IAAQ,CAAA,CAAE,KAAA,IAAS,IAAA,IAAQ,CAAA,CAAE,KAAA,IAAS,IAAA,IAAQ,CAAA,CAAE,MAAA,IAAU,IAAA,EAAM;AAE/E,MAAA,MAAM,UAAU,CAAA,CAAE,KAAA;AAClB,MAAA,MAAM,SAAS,CAAA,CAAE,KAAA;AACjB,MAAA,MAAM,QAAQ,CAAA,CAAE,KAAA;AAChB,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AAEjB,MAAA,MAAM,YAAY,OAAA,IAAW,MAAA;AAC7B,MAAA,MAAM,KAAA,GAAQ,SAAA,GAAY,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,SAAA;AAE9C,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,QAAA,CAAS,MAAA,EAAQ,YAAY,WAAW,CAAA;AAC5D,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,QAAA,CAAS,KAAA,EAAO,YAAY,WAAW,CAAA;AAC1D,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,QAAA,CAAS,MAAA,EAAQ,YAAY,WAAW,CAAA;AAC5D,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,QAAA,CAAS,OAAA,EAAS,YAAY,WAAW,CAAA;AAE9D,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,MAAM,CAAA;AACtC,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,MAAM,CAAA;AACzC,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,aAAa,OAAO,CAAA;AAGnD,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,MAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,KAAK,CAAA;AACnB,MAAA,GAAA,CAAI,MAAA,CAAO,GAAG,IAAI,CAAA;AAClB,MAAA,GAAA,CAAI,MAAA,EAAO;AAGX,MAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,MAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,MAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,MAAA,GAAA,CAAI,QAAA,CAAS,CAAA,GAAI,QAAA,EAAU,OAAA,EAAS,aAAa,UAAU,CAAA;AAC3D,MAAA,GAAA,CAAI,UAAA,CAAW,CAAA,GAAI,QAAA,EAAU,OAAA,EAAS,aAAa,UAAU,CAAA;AAAA,IAC/D;AAAA,EACF;AACF,CAAA;;;ACnGO,IAAM,MAAN,MAAgC;AAAA,EASnC,WAAA,CAAY,OAAA,GAAU,SAAA,EAAW,SAAA,GAAY,SAAA,EAAW;AARxD,IAAA,IAAA,CAAS,IAAA,GAAO,KAAA;AAEhB,IAAA,IAAA,CAAS,IAAA,GAAO,KAAA;AAChB,IAAA,IAAA,CAAS,UAAA,GAAa,EAAA;AAMlB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAA;AAAA,EACjB;AAAA,EAEA,QAAQ,IAAA,EAAqC;AACzC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,MAAO;AAAA,MACzB,KAAA,EAAO,CAAA;AAAA,MACP,KAAA,EAAO,IAAI,MAAA,IAAU,CAAA;AAAA;AAAA,MAErB,MAAA,EAAQ,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,OAAO,CAAA,GAAI;AAAA,KACxC,CAAE,CAAA;AAAA,EACN;AAAA,EAEA,MAAA,CACI,GAAA,EACA,OAAA,EACA,KAAA,EACA,UACA,UAAA,EACI;AACJ,IAAA,MAAM,UAAA,GAAc,GAAA,CAAI,MAAA,CAAwD,WAAA,IACzE,IAAI,MAAA,CAAO,KAAA;AAGlB,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,EAAE,KAAA,IAAS,IAAA,IAAQ,EAAE,KAAA,GAAQ,MAAA,WAAiB,CAAA,CAAE,KAAA;AAAA,IACxD;AACA,IAAA,IAAI,WAAW,CAAA,EAAG;AAElB,IAAA,MAAM,QAAQ,EAAE,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,SAAS,GAAA,EAAI;AAC1C,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,QAAA,CAAS,CAAA,EAAG,OAAO,UAAU,CAAA;AACjD,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,KAAA,CAAM,gBAAgB,QAAA,EAAU,UAAU,GAAG,CAAC,CAAA;AAErE,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACrB,MAAA,IAAI,CAAA,CAAE,KAAA,IAAS,IAAA,IAAQ,CAAA,CAAE,UAAU,CAAA,EAAG;AACtC,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,MAAM,OAAO,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,OAAO,UAAU,CAAA;AACtD,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,IAAI,CAAA;AAC/B,MAAA,GAAA,CAAI,SAAA,GAAY,CAAA,CAAE,MAAA,KAAW,CAAA,GAAI,CAAA,EAAG,KAAK,OAAO,CAAA,EAAA,CAAA,GAAO,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,EAAA,CAAA;AACxE,MAAA,GAAA,CAAI,SAAS,CAAA,GAAI,KAAA,GAAQ,CAAA,EAAG,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,IAC9C;AAGA,IAAA,GAAA,CAAI,YAAY,IAAA,CAAK,OAAA;AACrB,IAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,IAAA,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EACjC;AACJ,CAAA;;;AC3DO,IAAM,mBAAN,MAA6C;AAAA,EAIlD,WAAA,CACmB,MAAA,GAAS,EAAA,EAC1B,KAAA,GAAQ,SAAA,EACR;AAFiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAGjB,IAAA,IAAA,CAAK,IAAA,GAAO,QAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA,EAEA,QAAQ,IAAA,EAAqC;AAC3C,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,IAAA,MAAM,UAA6B,EAAC;AAIpC,IAAA,MAAM,IAAA,GAAQ,CAAA,IAAK,CAAA,GAAI,CAAA,CAAA,GAAM,CAAA;AAC7B,IAAA,MAAM,QAAS,CAAA,IAAK,CAAA,GAAI,CAAA,CAAA,IAAM,CAAA,GAAI,IAAI,CAAA,CAAA,GAAM,CAAA;AAC5C,IAAA,MAAM,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,IAAA,GAAO,IAAA;AAEjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,IAAI,CAAA,GAAI,IAAI,CAAA,EAAG;AACb,QAAA,OAAA,CAAQ,KAAK,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AACtC,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,IAAA,GAAO,CAAA;AACX,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,QAAA,MAAM,QAAQ,IAAA,CAAK,CAAA,IAAK,CAAA,GAAI,CAAA,GAAI,EAAE,CAAA,CAAE,KAAA;AACpC,QAAA,IAAA,IAAQ,KAAA;AACR,QAAA,KAAA,IAAS,CAAA,GAAI,KAAA;AAAA,MACf;AAEA,MAAA,MAAM,KAAA,GAAA,CAAS,CAAA,GAAI,KAAA,GAAQ,IAAA,GAAO,IAAA,IAAQ,KAAA;AAC1C,MAAA,MAAM,SAAA,GAAA,CAAa,IAAA,GAAO,KAAA,GAAQ,IAAA,IAAQ,CAAA;AAC1C,MAAA,MAAM,KAAA,GAAQ,SAAA,GAAY,KAAA,IAAS,CAAA,GAAI,CAAA,CAAA;AAEvC,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,CAAA,EAAG,OAAO,CAAA;AAAA,IAClC;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,MAAA,CACE,GAAA,EACA,OAAA,EACA,KAAA,EACA,UACA,WAAA,EACM;AACN,IAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,IAAA,MAAM,aAAa,MAAA,CAAO,WAAA;AAC1B,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,MAAM,UAAA,GAAc,MAAA,CAAwD,WAAA,IAAe,GAAA,CAAI,MAAA,CAAO,KAAA;AAEtG,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,cAAc,IAAA,CAAK,KAAA;AACvB,IAAA,GAAA,CAAI,SAAA,GAAY,GAAA;AAChB,IAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AAEf,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI,CAAA,CAAE,UAAU,IAAA,EAAM;AAAE,QAAA,OAAA,GAAU,KAAA;AAAO,QAAA;AAAA,MAAU;AACnD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,UAAU,UAAU,CAAA;AACtD,MAAA,MAAM,IAAI,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,YAAY,WAAW,CAAA;AACzD,MAAA,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,IAAK,IAAI,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA,EAAI,OAAA,GAAU,IAAA,CAAA;AAAA,IAC7D;AAEA,IAAA,GAAA,CAAI,MAAA,EAAO;AAAA,EACb;AACF,CAAA;;;AC7EA,IAAA,kBAAA,GAAA;AAAA,EACI;AAAA,IACI,IAAA,EAAQ,gBAAA;AAAA,IACR,UAAA,EAAc,IAAA;AAAA,IACd,IAAA,EAAQ,OAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,4BAAA;AAAA,IACR,UAAA,EAAc,KAAA;AAAA,IACd,IAAA,EAAQ,OAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,yBAAA;AAAA,IACR,UAAA,EAAc,KAAA;AAAA,IACd,IAAA,EAAQ,OAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,qBAAA;AAAA,IACR,UAAA,EAAc,KAAA;AAAA,IACd,IAAA,EAAQ,OAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,uBAAA;AAAA,IACR,UAAA,EAAc,UAAA;AAAA,IACd,IAAA,EAAQ,OAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,iBAAA;AAAA,IACR,UAAA,EAAc,IAAA;AAAA,IACd,IAAA,EAAQ,YAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,kBAAA;AAAA,IACR,UAAA,EAAc,IAAA;AAAA,IACd,IAAA,EAAQ,YAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,mBAAA;AAAA,IACR,UAAA,EAAc,IAAA;AAAA,IACd,IAAA,EAAQ,YAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,oBAAA;AAAA,IACR,UAAA,EAAc,KAAA;AAAA,IACd,IAAA,EAAQ,YAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,yBAAA;AAAA,IACR,UAAA,EAAc,KAAA;AAAA,IACd,IAAA,EAAQ,UAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,uBAAA;AAAA,IACR,UAAA,EAAc,OAAA;AAAA,IACd,IAAA,EAAQ,UAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,gBAAA;AAAA,IACR,UAAA,EAAc,UAAA;AAAA,IACd,IAAA,EAAQ,UAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,MAAA;AAAA,IACR,UAAA,EAAc,MAAA;AAAA,IACd,IAAA,EAAQ,UAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,yBAAA;AAAA,IACR,UAAA,EAAc,KAAA;AAAA,IACd,IAAA,EAAQ,UAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,aAAA;AAAA,IACR,UAAA,EAAc,IAAA;AAAA,IACd,IAAA,EAAQ,UAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,gBAAA;AAAA,IACR,UAAA,EAAc,KAAA;AAAA,IACd,IAAA,EAAQ,UAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,mBAAA;AAAA,IACR,UAAA,EAAc,KAAA;AAAA,IACd,IAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,QAAA;AAAA,IACR,UAAA,EAAc,KAAA;AAAA,IACd,IAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,+BAAA;AAAA,IACR,UAAA,EAAc,MAAA;AAAA,IACd,IAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,2BAAA;AAAA,IACR,UAAA,EAAc,KAAA;AAAA,IACd,IAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,kBAAA;AAAA,IACR,UAAA,EAAc,KAAA;AAAA,IACd,IAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,oBAAA;AAAA,IACR,UAAA,EAAc,KAAA;AAAA,IACd,IAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,uBAAA;AAAA,IACR,UAAA,EAAc,OAAA;AAAA,IACd,IAAA,EAAQ,oBAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,uBAAA;AAAA,IACR,UAAA,EAAc,KAAA;AAAA,IACd,IAAA,EAAQ,oBAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,YAAA;AAAA,IACR,UAAA,EAAc,YAAA;AAAA,IACd,IAAA,EAAQ,OAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,eAAA;AAAA,IACR,UAAA,EAAc,MAAA;AAAA,IACd,IAAA,EAAQ,OAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,gBAAA;AAAA,IACR,UAAA,EAAc,UAAA;AAAA,IACd,IAAA,EAAQ,OAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,KAAA;AAAA,IACR,UAAA,EAAc,KAAA;AAAA,IACd,IAAA,EAAQ,gBAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,oBAAA;AAAA,IACR,UAAA,EAAc,IAAA;AAAA,IACd,IAAA,EAAQ,UAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,aAAA;AAAA,IACR,UAAA,EAAc,IAAA;AAAA,IACd,IAAA,EAAQ,sBAAA;AAAA,IACR,OAAA,EAAW;AAAA,GACf;AAAA,EACA;AAAA,IACI,IAAA,EAAQ,mBAAA;AAAA,IACR,UAAA,EAAc,QAAA;AAAA,IACd,IAAA,EAAQ,OAAA;AAAA,IACR,OAAA,EAAW;AAAA;AAEnB,CAAA;;;ACvKO,SAAS,gBAAA,CAAiB,MAAkB,gBAAA,EAAsC;AACrF,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,IAAK,gBAAA,IAAoB,GAAG,OAAO,IAAA;AAEvD,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAwB;AAE5C,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACpB,IAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAA,GAAO,gBAAgB,CAAA,GAAI,gBAAA;AACtD,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC7B,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,IAClB,CAAA,MAAO;AACH,MAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,CAAC,GAAG,CAAC,CAAA;AAAA,IAC1B;AAAA,EACJ;AAEA,EAAA,MAAM,SAAqB,EAAC;AAE5B,EAAA,KAAA,MAAW,CAAC,UAAA,EAAY,KAAK,CAAA,IAAK,OAAA,EAAS;AACvC,IAAA,IAAI,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA;AACpB,IAAA,IAAI,GAAA,GAAM,KAAA,CAAM,CAAC,CAAA,CAAE,GAAA;AACnB,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACnB,MAAA,IAAI,CAAA,CAAE,IAAA,GAAO,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,IAAA;AAC5B,MAAA,IAAI,CAAA,CAAE,GAAA,GAAM,GAAA,EAAK,GAAA,GAAM,CAAA,CAAE,GAAA;AACzB,MAAA,MAAA,IAAU,EAAE,MAAA,IAAU,CAAA;AAAA,IAC1B;AACA,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACR,IAAA,EAAQ,UAAA;AAAA,MACR,IAAA,EAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA;AAAA,MACjB,IAAA;AAAA,MACA,GAAA;AAAA,MACA,KAAA,EAAQ,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAE,KAAA;AAAA,MAChC;AAAA,KACH,CAAA;AAAA,EACL;AAEA,EAAA,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,IAAA,GAAO,EAAE,IAAI,CAAA;AACrC,EAAA,OAAO,MAAA;AACX;;;AC6EA,IAAM,iBAAA,GAAwE;AAAA;AAAA,EAE1E,EAAE,WAAW,IAAA,EAAM,OAAA,EAAS,MAAM,IAAI,GAAA,CAAI,EAAE,CAAA,EAAE;AAAA,EAC9C,EAAE,WAAW,KAAA,EAAO,OAAA,EAAS,MAAM,IAAI,GAAA,CAAI,EAAE,CAAA,EAAE;AAAA,EAC/C,EAAE,WAAW,KAAA,EAAO,OAAA,EAAS,MAAM,IAAI,GAAA,CAAI,EAAE,CAAA,EAAE;AAAA,EAC/C,EAAE,WAAW,KAAA,EAAO,OAAA,EAAS,MAAM,IAAI,GAAA,CAAI,EAAE,CAAA,EAAE;AAAA,EAC/C,EAAE,SAAA,EAAW,UAAA,EAAY,SAAS,MAAM,IAAI,UAAS,EAAE;AAAA;AAAA,EAEvD,EAAE,WAAW,IAAA,EAAM,OAAA,EAAS,MAAM,IAAI,cAAA,CAAe,EAAA,EAAI,CAAC,CAAA,EAAE;AAAA,EAC5D,EAAE,WAAW,IAAA,EAAM,OAAA,EAAS,MAAM,IAAI,eAAA,CAAgB,EAAA,EAAI,CAAC,CAAA,EAAE;AAAA,EAC7D,EAAE,WAAW,IAAA,EAAM,OAAA,EAAS,MAAM,IAAI,gBAAA,CAAiB,EAAE,CAAA,EAAE;AAAA,EAC3D,EAAE,WAAW,KAAA,EAAO,OAAA,EAAS,MAAM,IAAI,GAAA,CAAI,EAAE,CAAA,EAAE;AAAA;AAAA,EAE/C,EAAE,WAAW,KAAA,EAAO,OAAA,EAAS,MAAM,IAAI,GAAA,CAAI,EAAE,CAAA,EAAE;AAAA,EAC/C,EAAE,WAAW,OAAA,EAAS,OAAA,EAAS,MAAM,IAAI,UAAA,CAAW,EAAA,EAAI,CAAC,CAAA,EAAE;AAAA,EAC3D,EAAE,SAAA,EAAW,UAAA,EAAY,OAAA,EAAS,MAAM,IAAI,QAAA,CAAS,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,CAAC,CAAA,EAAE;AAAA,EACnE,EAAE,SAAA,EAAW,MAAA,EAAQ,OAAA,EAAS,MAAM,IAAI,IAAA,CAAK,EAAA,EAAI,EAAA,EAAI,CAAC,CAAA,EAAE;AAAA,EACxD,EAAE,WAAW,KAAA,EAAO,OAAA,EAAS,MAAM,IAAI,GAAA,CAAI,EAAE,CAAA,EAAE;AAAA,EAC/C,EAAE,WAAW,IAAA,EAAM,OAAA,EAAS,MAAM,IAAI,SAAA,CAAU,EAAE,CAAA,EAAE;AAAA,EACpD,EAAE,WAAW,KAAA,EAAO,OAAA,EAAS,MAAM,IAAI,GAAA,CAAI,EAAE,CAAA,EAAE;AAAA,EAC/C,EAAE,SAAA,EAAW,IAAA,EAAM,SAAS,MAAM,IAAI,mBAAkB,EAAE;AAAA;AAAA,EAE1D,EAAE,SAAA,EAAW,KAAA,EAAO,SAAS,MAAM,IAAI,KAAI,EAAE;AAAA,EAC7C,EAAE,SAAA,EAAW,MAAA,EAAQ,SAAS,MAAM,IAAI,MAAK,EAAE;AAAA,EAC/C,EAAE,SAAA,EAAW,KAAA,EAAO,SAAS,MAAM,IAAI,iBAAgB,EAAE;AAAA,EACzD,EAAE,WAAW,KAAA,EAAO,OAAA,EAAS,MAAM,IAAI,GAAA,CAAI,EAAE,CAAA,EAAE;AAAA,EAC/C,EAAE,WAAW,KAAA,EAAO,OAAA,EAAS,MAAM,IAAI,GAAA,CAAI,EAAE,CAAA,EAAE;AAAA;AAAA,EAE/C,EAAE,SAAA,EAAW,OAAA,EAAS,SAAS,MAAM,IAAI,aAAY,EAAE;AAAA,EACvD,EAAE,WAAW,KAAA,EAAO,OAAA,EAAS,MAAM,IAAI,uBAAA,CAAwB,EAAE,CAAA,EAAE;AAAA;AAAA,EAEnE,EAAE,WAAW,YAAA,EAAc,OAAA,EAAS,MAAM,IAAI,UAAA,CAAW,EAAA,EAAI,CAAC,CAAA,EAAE;AAAA,EAChE,EAAE,WAAW,MAAA,EAAQ,OAAA,EAAS,MAAM,IAAI,YAAA,CAAa,IAAA,EAAM,GAAG,CAAA,EAAE;AAAA,EAChE,EAAE,SAAA,EAAW,UAAA,EAAY,OAAA,EAAS,MAAM,IAAI,aAAA,CAAc,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA,EAAE;AAAA;AAAA,EAErE,EAAE,WAAW,KAAA,EAAO,OAAA,EAAS,MAAM,IAAI,GAAA,CAAI,EAAE,CAAA,EAAE;AAAA;AAAA,EAE/C,EAAE,SAAA,EAAW,IAAA,EAAM,SAAS,MAAM,IAAI,YAAW,EAAE;AAAA;AAAA,EAEnD,EAAE,SAAA,EAAW,KAAA,EAAO,SAAS,MAAM,IAAI,KAAI,EAAE;AAAA;AAAA,EAE7C,EAAE,WAAW,QAAA,EAAU,OAAA,EAAS,MAAM,IAAI,gBAAA,CAAiB,EAAE,CAAA;AACjE,CAAA;AAGA,IAAM,eAAA,GAAiC;AAAA,EACnC,IAAA,EAAM,QAAA;AAAA,EACN,GAAA,EAAK,WAAA;AAAA,EACL,KAAA,EAAO,WAAA;AAAA,EACP,OAAA,EAAS,CAAC,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAAA,EACrF,OAAA,EAAS;AACb,CAAA;AAGA,SAAS,mBAAA,CACL,SAAA,EACA,MAAA,EACA,MAAA,EACM;AACN,EAAA,IAAI,CAAC,QAAQ,OAAO,SAAA;AACpB,EAAA,MAAM,OAAO,MAAA,CAAO,MAAA,CACf,OAAO,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,QAAQ,CAAA,CACjC,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,EAAE,GAAG,CAAA,IAAK,EAAE,OAAO,CAAA;AAC1C,EAAA,OAAO,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,CAAA,EAAG,SAAS,IAAI,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GAAM,SAAA;AAClE;AAGA,IAAM,uBAAA,GAAkD;AAAA;AAAA,EAEpD;AAAA,IACI,SAAA,EAAW,IAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACJ;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,SAAA,EAAU;AAAA,MAClE;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS,CAAC,MAAA,EAAQ,MAAA,EAAQ,OAAO,OAAO,CAAA;AAAA,QACxC,OAAA,EAAS;AAAA;AACb,KACJ;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KACN,IAAI,GAAA,CAAI,CAAA,CAAE,MAAA,EAAkB,CAAA,CAAE,KAAA,EAAiB,IAAA,EAAM,CAAA,CAAE,MAAqB;AAAA,GACpF;AAAA,EACA;AAAA,IACI,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACJ;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,SAAA,EAAU;AAAA,MAClE;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS,CAAC,MAAA,EAAQ,MAAA,EAAQ,OAAO,OAAO,CAAA;AAAA,QACxC,OAAA,EAAS;AAAA;AACb,KACJ;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KACN,IAAI,GAAA,CAAI,CAAA,CAAE,MAAA,EAAkB,CAAA,CAAE,KAAA,EAAiB,KAAA,EAAO,CAAA,CAAE,MAAqB;AAAA,GACrF;AAAA,EACA;AAAA,IACI,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACJ;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,SAAA,EAAU;AAAA,MAClE;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS,CAAC,MAAA,EAAQ,MAAA,EAAQ,OAAO,OAAO,CAAA;AAAA,QACxC,OAAA,EAAS;AAAA;AACb,KACJ;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KACN,IAAI,GAAA,CAAI,CAAA,CAAE,MAAA,EAAkB,CAAA,CAAE,KAAA,EAAiB,KAAA,EAAO,CAAA,CAAE,MAAqB;AAAA,GACrF;AAAA,EACA;AAAA,IACI,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACJ;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,SAAA,EAAU;AAAA,MAClE;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS,CAAC,MAAA,EAAQ,MAAA,EAAQ,OAAO,OAAO,CAAA;AAAA,QACxC,OAAA,EAAS;AAAA;AACb,KACJ;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KACN,IAAI,GAAA,CAAI,CAAA,CAAE,MAAA,EAAkB,CAAA,CAAE,KAAA,EAAiB,KAAA,EAAO,CAAA,CAAE,MAAqB;AAAA,GACrF;AAAA,EACA;AAAA,IACI,SAAA,EAAW,UAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACJ,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,SAAA,EAAU;AAAA,MAClE;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS,CAAC,MAAA,EAAQ,MAAA,EAAQ,OAAO,OAAO,CAAA;AAAA,QACxC,OAAA,EAAS;AAAA;AACb,KACJ;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KAAM,IAAI,SAAS,CAAA,CAAE,KAAA,EAAiB,EAAE,MAAqB;AAAA,GAC3E;AAAA;AAAA,EAEA;AAAA,IACI,SAAA,EAAW,IAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACJ;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,SAAA;AAAA,QACP,GAAA,EAAK,GAAA;AAAA,QACL,GAAA,EAAK,EAAA;AAAA,QACL,IAAA,EAAM,GAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,SAAA,EAAU;AAAA,MAClE;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS,CAAC,MAAA,EAAQ,MAAA,EAAQ,OAAO,OAAO,CAAA;AAAA,QACxC,OAAA,EAAS;AAAA;AACb,KACJ;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KACN,IAAI,cAAA;AAAA,MACA,CAAA,CAAE,MAAA;AAAA,MACF,CAAA,CAAE,MAAA;AAAA,MACF,CAAA,CAAE,KAAA;AAAA,MACF,IAAA;AAAA,MACA,CAAA,CAAE;AAAA;AACN,GACR;AAAA,EACA;AAAA,IACI,SAAA,EAAW,IAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACJ;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,MAAA;AAAA,QACL,KAAA,EAAO,YAAA;AAAA,QACP,GAAA,EAAK,GAAA;AAAA,QACL,GAAA,EAAK,EAAA;AAAA,QACL,IAAA,EAAM,GAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,WAAA;AAAA,QACL,KAAA,EAAO,YAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,SAAA;AAAU,KACtE;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KACN,IAAI,eAAA;AAAA,MACA,CAAA,CAAE,MAAA;AAAA,MACF,CAAA,CAAE,IAAA;AAAA,MACF,CAAA,CAAE,SAAA;AAAA,MACF,CAAA,CAAE;AAAA;AACN,GACR;AAAA,EACA;AAAA,IACI,SAAA,EAAW,IAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACJ;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,SAAA;AAAU,KACtE;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KAAM,IAAI,iBAAiB,CAAA,CAAE,MAAA,EAAkB,EAAE,KAAe;AAAA,GAC9E;AAAA,EACA;AAAA,IACI,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACJ;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,SAAA;AAAU,KACtE;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KAAM,IAAI,IAAI,CAAA,CAAE,MAAA,EAAkB,EAAE,KAAe;AAAA,GACjE;AAAA;AAAA,EAEA;AAAA,IACI,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACJ;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,SAAA,EAAU;AAAA,MAClE;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS,CAAC,MAAA,EAAQ,MAAA,EAAQ,OAAO,OAAO,CAAA;AAAA,QACxC,OAAA,EAAS;AAAA;AACb,KACJ;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KACN,IAAI,GAAA,CAAI,CAAA,CAAE,MAAA,EAAkB,CAAA,CAAE,KAAA,EAAiB,KAAA,EAAO,CAAA,CAAE,MAAqB;AAAA,GACrF;AAAA,EACA;AAAA,IACI,SAAA,EAAW,OAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACJ;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,SAAA;AAAA,QACL,KAAA,EAAO,UAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,SAAA;AAAA,QACL,KAAA,EAAO,UAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,SAAA;AAAU,KACtE;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KAAM,IAAI,UAAA,CAAW,EAAE,OAAA,EAAmB,CAAA,CAAE,OAAA,EAAmB,CAAA,CAAE,KAAe;AAAA,GAC9F;AAAA,EACA;AAAA,IACI,SAAA,EAAW,UAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACJ;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,WAAA;AAAA,QACL,KAAA,EAAO,YAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,aAAA;AAAA,QACL,KAAA,EAAO,cAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,SAAA;AAAA,QACL,KAAA,EAAO,UAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,SAAA;AAAA,QACL,KAAA,EAAO,UAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,SAAA;AAAU,KACtE;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KACN,IAAI,QAAA;AAAA,MACA,CAAA,CAAE,SAAA;AAAA,MACF,CAAA,CAAE,WAAA;AAAA,MACF,CAAA,CAAE,OAAA;AAAA,MACF,CAAA,CAAE,OAAA;AAAA,MACF,CAAA,CAAE;AAAA;AACN,GACR;AAAA,EACA;AAAA,IACI,SAAA,EAAW,MAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACJ;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,MAAA;AAAA,QACL,KAAA,EAAO,aAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,MAAA;AAAA,QACL,KAAA,EAAO,aAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,eAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,SAAA,EAAU;AAAA,MAClE;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS,CAAC,MAAA,EAAQ,MAAA,EAAQ,OAAO,OAAO,CAAA;AAAA,QACxC,OAAA,EAAS;AAAA;AACb,KACJ;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KACN,IAAI,IAAA;AAAA,MACA,CAAA,CAAE,IAAA;AAAA,MACF,CAAA,CAAE,IAAA;AAAA,MACF,CAAA,CAAE,MAAA;AAAA,MACF,CAAA,CAAE,KAAA;AAAA,MACF,MAAA;AAAA,MACA,CAAA,CAAE;AAAA;AACN,GACR;AAAA,EACA;AAAA,IACI,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACJ;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,SAAA;AAAU,KACtE;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KAAM,IAAI,IAAI,CAAA,CAAE,MAAA,EAAkB,EAAE,KAAe;AAAA,GACjE;AAAA,EACA;AAAA,IACI,SAAA,EAAW,IAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACJ;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,SAAA;AAAU,KACtE;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KAAM,IAAI,UAAU,CAAA,CAAE,MAAA,EAAkB,EAAE,KAAe;AAAA,GACvE;AAAA,EACA;AAAA,IACI,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACJ;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,SAAA,EAAU;AAAA,MAClE;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS,CAAC,MAAA,EAAQ,MAAA,EAAQ,OAAO,OAAO,CAAA;AAAA,QACxC,OAAA,EAAS;AAAA;AACb,KACJ;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KAAM,IAAI,GAAA,CAAI,EAAE,MAAA,EAAkB,CAAA,CAAE,KAAA,EAAiB,CAAA,CAAE,MAAqB;AAAA,GAC1F;AAAA,EACA;AAAA,IACI,SAAA,EAAW,IAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACJ;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,YAAA;AAAA,QACL,KAAA,EAAO,aAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,YAAA;AAAA,QACL,KAAA,EAAO,aAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,SAAA;AAAU,KACtE;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KACN,IAAI,iBAAA;AAAA,MACA,CAAA,CAAE,UAAA;AAAA,MACF,CAAA,CAAE,UAAA;AAAA,MACF,CAAA,CAAE;AAAA;AACN,GACR;AAAA;AAAA,EAEA;AAAA,IACI,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ,CAAC,EAAE,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,CAAA;AAAA,IAC5E,SAAS,CAAC,CAAA,KAAM,IAAI,GAAA,CAAI,EAAE,KAAe;AAAA,GAC7C;AAAA,EACA;AAAA,IACI,SAAA,EAAW,MAAA;AAAA,IACX,MAAA,EAAQ,CAAC,EAAE,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,CAAA;AAAA,IAC5E,SAAS,CAAC,CAAA,KAAM,IAAI,IAAA,CAAK,EAAE,KAAe;AAAA,GAC9C;AAAA,EACA;AAAA,IACI,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ,CAAC,EAAE,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,CAAA;AAAA,IAC5E,SAAS,CAAC,CAAA,KAAM,IAAI,eAAA,CAAgB,EAAE,KAAe;AAAA,GACzD;AAAA,EACA;AAAA,IACI,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACJ;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,SAAA;AAAU,KACtE;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KAAM,IAAI,IAAI,CAAA,CAAE,MAAA,EAAkB,EAAE,KAAe;AAAA,GACjE;AAAA,EACA;AAAA,IACI,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACJ;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,SAAA;AAAU,KACtE;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KAAM,IAAI,IAAI,CAAA,CAAE,MAAA,EAAkB,EAAE,KAAe;AAAA,GACjE;AAAA;AAAA,EAEA;AAAA,IACI,SAAA,EAAW,OAAA;AAAA,IACX,MAAA,EAAQ,CAAC,EAAE,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,CAAA;AAAA,IAC5E,SAAS,CAAC,CAAA,KAAM,IAAI,WAAA,CAAY,EAAE,KAAe;AAAA,GACrD;AAAA,EACA;AAAA,IACI,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACJ;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,UAAA;AAAA,QACL,KAAA,EAAO,UAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,SAAA;AAAU,KACtE;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KAAM,IAAI,wBAAwB,CAAA,CAAE,QAAA,EAAoB,EAAE,KAAe;AAAA,GACvF;AAAA;AAAA,EAEA;AAAA,IACI,SAAA,EAAW,YAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACJ;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,WAAA;AAAA,QACL,KAAA,EAAO,YAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,YAAA;AAAA,QACL,KAAA,EAAO,YAAA;AAAA,QACP,GAAA,EAAK,GAAA;AAAA,QACL,GAAA,EAAK,EAAA;AAAA,QACL,IAAA,EAAM,GAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,SAAA;AAAU,KACtE;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KACN,IAAI,UAAA,CAAW,EAAE,SAAA,EAAqB,CAAA,CAAE,UAAA,EAAsB,CAAA,CAAE,KAAe;AAAA,GACvF;AAAA,EACA;AAAA,IACI,SAAA,EAAW,MAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACJ;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,MAAA;AAAA,QACL,KAAA,EAAO,MAAA;AAAA,QACP,GAAA,EAAK,IAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,IAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,OAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,GAAA,EAAK,IAAA;AAAA,QACL,GAAA,EAAK,CAAA;AAAA,QACL,IAAA,EAAM,IAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,SAAA;AAAU,KACtE;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KAAM,IAAI,YAAA,CAAa,EAAE,IAAA,EAAgB,CAAA,CAAE,KAAA,EAAiB,CAAA,CAAE,KAAe;AAAA,GAC3F;AAAA,EACA;AAAA,IACI,SAAA,EAAW,UAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACJ;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,eAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,OAAA;AAAA,QACL,KAAA,EAAO,cAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,SAAA;AAAA,QACL,KAAA,EAAO,iBAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,SAAA;AAAU,KACtE;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KACN,IAAI,aAAA;AAAA,MACA,CAAA,CAAE,MAAA;AAAA,MACF,CAAA,CAAE,KAAA;AAAA,MACF,CAAA,CAAE,OAAA;AAAA,MACF,CAAA,CAAE;AAAA;AACN,GACR;AAAA;AAAA,EAEA;AAAA,IACI,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACJ;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,SAAA;AAAU,KACtE;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KAAM,IAAI,IAAI,CAAA,CAAE,MAAA,EAAkB,EAAE,KAAe;AAAA,GACjE;AAAA;AAAA,EAEA;AAAA,IACI,SAAA,EAAW,IAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACJ,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,SAAA,EAAU;AAAA,MAClE,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,WAAW,KAAA,EAAO,UAAA,EAAY,SAAS,SAAA,EAAU;AAAA,MACvE,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,aAAa,KAAA,EAAO,YAAA,EAAc,SAAS,SAAA;AAAU,KAC/E;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KACN,IAAI,UAAA,CAAW,EAAE,KAAA,EAAiB,CAAA,CAAE,OAAA,EAAmB,CAAA,CAAE,SAAmB;AAAA,GACpF;AAAA;AAAA,EAEA;AAAA,IACI,SAAA,EAAW,KAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACJ,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,WAAW,KAAA,EAAO,UAAA,EAAY,SAAS,SAAA,EAAU;AAAA,MACvE,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,aAAa,KAAA,EAAO,YAAA,EAAc,SAAS,SAAA;AAAU,KAC/E;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KAAM,IAAI,IAAI,CAAA,CAAE,OAAA,EAAmB,EAAE,SAAmB;AAAA,GACtE;AAAA;AAAA,EAEA;AAAA,IACI,SAAA,EAAW,QAAA;AAAA,IACX,MAAA,EAAQ;AAAA,MACJ;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,QAAA;AAAA,QACP,GAAA,EAAK,CAAA;AAAA,QACL,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACb;AAAA,MACA,EAAE,MAAM,OAAA,EAAS,GAAA,EAAK,SAAS,KAAA,EAAO,OAAA,EAAS,SAAS,SAAA;AAAU,KACtE;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KAAM,IAAI,iBAAiB,CAAA,CAAE,MAAA,EAAkB,EAAE,KAAe;AAAA;AAElF,CAAA;AAGA,IAAM,gBAAA,GAAmB,EAAA;AACzB,IAAM,gBAAA,GAAmB,EAAA;AACzB,IAAM,kBAAA,GAAqB,IAAA;AAC3B,IAAM,eAAA,GAAkB,EAAA;AACxB,IAAM,cAAA,GAAiB,CAAA;AACvB,IAAM,oBAAA,GAAuB,EAAA;AAC7B,IAAM,yBAAA,GAA4B,EAAA;AAClC,IAAM,gBAAA,GAAmB,IAAA;AACzB,IAAM,aAAA,GAAgB,GAAA;AACtB,SAAS,cAAA,GAA0B;AAC/B,EAAA,OACI,OAAO,MAAA,KAAW,WAAA,KAAgB,cAAA,IAAkB,MAAA,IAAU,UAAU,cAAA,GAAiB,CAAA,CAAA;AAEjG;AACA,SAAS,kBAAA,CACL,mBAA2B,CAAA,EAC3B,UAAA,GAAa,OACb,WAAA,GAAc,oBAAA,EACd,iBAAA,EACA,UAAA,EACA,qBAAA,EACM;AAEN,EAAA,IAAI,UAAA,IAAc,UAAA,GAAa,CAAA,IAAK,qBAAA,IAAyB,wBAAwB,CAAA,EAAG;AACpF,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,qBAAqB,CAAA;AAC1D,IAAA,OAAO,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,GAAA,CAAI,GAAA,EAAK,IAAI,CAAC,CAAA;AAAA,EAC3C;AACA,EAAA,IAAI,CAAC,UAAA,IAAc,CAAC,cAAA,IAAkB,OAAO,WAAA;AAC7C,EAAA,IAAI,iBAAA,KAAsB,QAAW,OAAO,iBAAA;AAC5C,EAAA,OAAO,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,KAAA,CAAM,WAAA,GAAc,gBAAgB,CAAC,CAAA;AAClE;AACA,IAAM,SAAA,GAAY,CAAA;AAGlB,SAAS,iBAAA,CACL,OACA,MAAA,EAC4B;AAC5B,EAAA,MAAM,GAAA,GAAA,CAAO,KAAA,CAAM,GAAA,GAAM,KAAA,CAAM,GAAA,IAAO,CAAA;AACtC,EAAA,MAAM,IAAA,GAAA,CAAQ,KAAA,CAAM,GAAA,GAAM,KAAA,CAAM,GAAA,IAAO,CAAA;AACvC,EAAA,OAAO,EAAE,KAAK,GAAA,GAAM,IAAA,GAAO,QAAQ,GAAA,EAAK,GAAA,GAAM,OAAO,MAAA,EAAO;AAChE;AAEA,SAAS,qBAAqB,KAAA,EAA6C;AACvE,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,GAAM,KAAA,CAAM,GAAA;AAC/B,EAAA,IAAI,IAAA,IAAQ,KAAK,OAAO,CAAA;AACxB,EAAA,IAAI,IAAA,IAAQ,IAAI,OAAO,CAAA;AACvB,EAAA,IAAI,IAAA,IAAQ,GAAG,OAAO,CAAA;AACtB,EAAA,IAAI,IAAA,IAAQ,KAAK,OAAO,CAAA;AACxB,EAAA,OAAO,CAAA;AACX;AAQO,IAAM,YAAA,GAAN,MAAM,YAAA,CAAY;AAAA,EAqUrB,YAAY,MAAA,EAAqB;AA5TjC;AAAA,IAAA,IAAA,CAAQ,MAAA,GAAwB,IAAA;AAChC,IAAA,IAAA,CAAQ,SAAA,GAA8B,IAAA;AACtC,IAAA,IAAA,CAAQ,OAAA,GAA0B,IAAA;AAClC,IAAA,IAAA,CAAQ,cAAA,GAAiB,IAAA;AACzB,IAAA,IAAA,CAAQ,mBAAA,GAAsB,IAAA;AAC9B,IAAA,IAAA,CAAQ,eAAA,GAAkB,IAAA;AAC1B,IAAA,IAAA,CAAQ,iBAAA,GAAoB,IAAA;AAC5B,IAAA,IAAA,CAAQ,aAAA,GAAgB,KAAA;AACxB,IAAA,IAAA,CAAQ,gBAAA,GAA4C,IAAA;AACpD,IAAA,IAAA,CAAQ,eAAA,uBAAsB,GAAA,EAA8B;AAE5D;AAAA,IAAA,IAAA,CAAQ,eAAA,GAA0C,IAAA;AAClD,IAAA,IAAA,CAAQ,QAAkB,EAAC;AAE3B;AAAA,IAAA,IAAA,CAAQ,IAAA,GAA8B,IAAA;AACtC,IAAA,IAAA,CAAQ,WAAA,GAAsC,IAAA;AAC9C,IAAA,IAAA,CAAQ,YAAA,GAAuC,IAAA;AAC/C,IAAA,IAAA,CAAQ,UAAA,GAAqC,IAAA;AAC7C,IAAA,IAAA,CAAQ,WAAA,GAAsC,IAAA;AAC9C,IAAA,IAAA,CAAQ,iBAAA,GAA0D,IAAA;AAClE,IAAA,IAAA,CAAQ,cAAA,GAAiB,GAAA;AACzB,IAAA,IAAA,CAAQ,YAAA,GAA6B,cAAA;AAGrC;AAAA;AAAA,IAAA,IAAA,CAAQ,YAAA,GAAe,KAAA;AACvB,IAAA,IAAA,CAAQ,uBAAA,GAA0D,IAAA;AAClE,IAAA,IAAA,CAAQ,mBAAA,GAAkD,IAAA;AAC1D,IAAA,IAAA,CAAQ,WAAA,GAAkC,IAAA;AAC1C,IAAA,IAAA,CAAQ,YAAA,GAAoC,IAAA;AAC5C,IAAA,IAAA,CAAQ,mBAAA,GAAkD,IAAA;AAC1D,IAAA,IAAA,CAAQ,eAAA,GAAiC,IAAA;AACzC,IAAA,IAAA,CAAQ,QAAA,GAAW,CAAA;AACnB,IAAA,IAAA,CAAQ,kBAAA,GAAqB,KAAA;AAC7B,IAAA,IAAA,CAAQ,YAAA,GAAe,CAAA;AACvB,IAAA,IAAA,CAAQ,YAAA,GAAe,GAAA;AACvB,IAAA,IAAA,CAAQ,eAAA,GAAyC,IAAA;AACjD,IAAA,IAAA,CAAQ,iBAAA,GAA4F,MAAA;AACpG,IAAA,IAAA,CAAQ,mBAAA,GAA0C,MAAA;AAClD,IAAA,IAAA,CAAQ,iBAAA,uBAAwB,GAAA,EAAoB;AACpD,IAAA,IAAA,CAAQ,kBAAA,uBAAyB,GAAA,EAAgC;AACjE,IAAA,IAAA,CAAQ,cAAA,GAA6D,MAAA;AACrE,IAAA,IAAA,CAAQ,cAAA,GAA2C,IAAA;AACnD,IAAA,IAAA,CAAQ,kBAAA,GAAqB,KAAA;AAC7B,IAAA,IAAA,CAAQ,YAAA,GAA8B,IAAA;AACtC,IAAA,IAAA,CAAQ,YAAA,GAAyC,IAAA;AACjD,IAAA,IAAA,CAAQ,gBAAA,GAAmB,KAAA;AAC3B,IAAA,IAAA,CAAQ,mBAAA,GAAsB,oBAAA;AAE9B;AAAA,IAAA,IAAA,CAAQ,SAAA,GAAY,IAAI,SAAA,EAAU;AAClC,IAAA,IAAA,CAAQ,YAAA,GAAe,IAAI,YAAA,EAAa;AACxC,IAAA,IAAA,CAAQ,OAAA,GAAU,IAAI,YAAA,EAA4B;AAElD,IAAA,IAAA,CAAQ,SAAA,GAA8B,MAAA;AACtC,IAAA,IAAA,CAAQ,MAAA,GAAS,KAAA;AAGjB,IAAA,IAAA,CAAQ,MAAA,GAAiB,EAAA;AACzB,IAAA,IAAA,CAAQ,eAAA,GAAkB,KAAA;AAC1B,IAAA,IAAA,CAAQ,WAAA,GAAc,KAAA;AACtB,IAAA,IAAA,CAAQ,sBAAA,GAAyB,KAAA;AACjC,IAAA,IAAA,CAAQ,4BAAA,GAA+B,KAAA;AACvC,IAAA,IAAA,CAAQ,qBAAA,GAAwB,CAAA;AAChC,IAAA,IAAA,CAAQ,sBAAA,GAAyB,IAAA;AACjC,IAAA,IAAA,CAAQ,wBAAA,GAA2B,EAAA;AACnC,IAAA,IAAA,CAAQ,iBAAA,GAAoB,KAAA;AAG5B,IAAA,IAAA,CAAQ,mBAA2C,EAAC;AAWpD,IAAA,IAAA,CAAQ,gBAAA,uBAAuB,GAAA,EAA+C;AAC9E,IAAA,IAAA,CAAQ,QAAA,GAAqB;AAAA,MACzB,UAAA,EAAY,CAAA;AAAA,MACZ,UAAU,kBAAA,EAAmB;AAAA,MAC7B,WAAA,EAAa,CAAA;AAAA,MACb,SAAA,EAAW;AAAA,KACf;AAEA;AAAA,IAAA,IAAA,CAAQ,eAAA,GAA4B;AAAA,MAChC,UAAA,EAAY,CAAA;AAAA,MACZ,UAAU,kBAAA,EAAmB;AAAA,MAC7B,WAAA,EAAa,CAAA;AAAA,MACb,SAAA,EAAW;AAAA,KACf;AACA,IAAA,IAAA,CAAQ,UAAA,GAAa,KAAA;AACrB,IAAA,IAAA,CAAQ,SAAA,GAAsC,IAAA;AAE9C;AAAA,IAAA,IAAA,CAAQ,cAAA,GAAiB,IAAI,cAAA,EAAe;AAC5C,IAAA,IAAA,CAAQ,WAAA,GAAuC,IAAA;AAC/C,IAAA,IAAA,CAAQ,gBAAA,GAA8D,IAAA;AAEtE;AAAA,IAAA,IAAA,CAAQ,gBAAA,GAIG,IAAA;AAEX;AAAA,IAAA,IAAA,CAAQ,kBAAA,GAKG,IAAA;AAOX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,iBAAA,GAMG,IAAA;AAGX;AAAA;AAAA,IAAA,IAAA,CAAQ,mBAAA,uBAA0B,GAAA,EAAoB;AACtD,IAAA,IAAA,CAAQ,aAAA,GAIG,IAAA;AAEX;AAAA,IAAA,IAAA,CAAiB,cAAA,GAAiB,gBAAA;AAClC,IAAA,IAAA,CAAiB,cAAA,GAAiB,gBAAA;AAElC;AAAA,IAAA,IAAA,CAAQ,gBAAA,GAAmB,CAAA;AAC3B;AAAA,IAAA,IAAA,CAAQ,cAAA,GAAiB,CAAA;AACzB;AAAA,IAAA,IAAA,CAAQ,oBAAA,GAA0C,IAAA;AAClD;AAAA,IAAA,IAAA,CAAQ,kBAAA,GAAwC,IAAA;AAMhD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,uBAAA,GAEK,IAAA;AASb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,qBAAA,GAA8D,IAAA;AAWtE,IAAA,IAAA,CAAQ,QAAA,GAKG,IAAA;AACX,IAAA,IAAA,CAAQ,mBAAA,uBAA0B,GAAA,EAAoB;AACtD,IAAA,IAAA,CAAQ,sBAAA,GAAyB,KAAA;AACjC,IAAA,IAAA,CAAQ,iBAAA,GAAqD,IAAA;AAC7D,IAAA,IAAA,CAAQ,eAAA,GAAwD,IAAA;AAChE,IAAA,IAAA,CAAQ,eAAA,GAAmD,IAAA;AAC3D,IAAA,IAAA,CAAQ,cAAA,GAAiB,CAAA;AACzB,IAAA,IAAA,CAAQ,qBAAA,GAA6D,IAAA;AAKrE,IAAA,IAAA,CAAQ,oBAAgC,MAAM;AAAA,IAAC,CAAA;AAC/C,IAAA,IAAA,CAAQ,KAAA,GAAuB,IAAA;AAC/B,IAAA,IAAA,CAAQ,cAAA,GAAgC,IAAA;AACxC,IAAA,IAAA,CAAQ,eAAA,GAAkB,KAAA;AAC1B,IAAA,IAAA,CAAQ,eAAA,GAAkC,IAAA;AAC1C,IAAA,IAAA,CAAQ,eAAA,GAAkC,IAAA;AAE1C;AAAA,IAAA,IAAA,CAAQ,sBAAA,GAAyB,KAAA;AACjC;AAAA,IAAA,IAAA,CAAQ,sBAAA,GAAqE,IAAA;AAC7E,IAAA,IAAA,CAAQ,iBAAA,GAAqD,IAAA;AAE7D;AAAA;AAAA,IAAA,IAAA,CAAQ,oBAAA,GAA8C,IAAA;AAEtD;AAAA,IAAA,IAAA,CAAQ,gBAAA,GAAmB,KAAA;AAgB3B,IAAA,IAAA,CAAQ,QAAA,GAAmB,KAAA;AAC3B,IAAA,IAAA,CAAQ,uBAAmE,EAAC;AAI5E;AAAA,IAAA,IAAA,CAAQ,aAAA,GAA0C,IAAA;AAClD,IAAA,IAAA,CAAQ,UAAA,GAAkD,IAAA;AAC1D,IAAA,IAAA,CAAQ,oBAAA,GAAsC,KAAA;AAG9C;AAAA;AAAA,IAAA,IAAA,CAAQ,cAAA,GAAiB,KAAA;AAEzB;AAAA,IAAA,IAAA,CAAQ,SAAqB,EAAC;AAC9B,IAAA,IAAA,CAAQ,qBAA0C,EAAC;AACnD,IAAA,IAAA,CAAQ,sBAA4C,EAAC;AACrD,IAAA,IAAA,CAAQ,sBAA2C,EAAC;AACpD,IAAA,IAAA,CAAQ,kBAAoC,EAAC;AAC7C,IAAA,IAAA,CAAQ,sBAAqC,EAAC;AAC9C,IAAA,IAAA,CAAQ,yBAAkD,EAAC;AAC3D,IAAA,IAAA,CAAQ,uBAA8C,EAAC;AACvD,IAAA,IAAA,CAAQ,oBAA2C,EAAC;AACpD,IAAA,IAAA,CAAQ,eAA+B,EAAC;AAExC;AAAA,IAAA,IAAA,CAAQ,gBAAA,uBAAoC,GAAA,EAAI;AAChD,IAAA,IAAA,CAAQ,iBAAA,GAAmC,IAAA;AAC3C,IAAA,IAAA,CAAQ,kBAAA,GAAoC,IAAA;AAU5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAQ,cAAA,GAAgC,IAAA;AAIxC;AAAA,IAAA,IAAA,CAAQ,kBAAgD,EAAC;AAEzD;AAAA,IAAA,IAAA,CAAQ,gBAAA,GAA4C,IAAA;AACpD,IAAA,IAAA,CAAQ,iBAAA,GAAmC,IAAA;AAE3C;AAAA,IAAA,IAAA,CAAQ,mBAAA,GAAqC,IAAA;AAE7C;AAAA,IAAA,IAAA,CAAQ,mBAAA,GAAqC,IAAA;AAE7C;AAAA,IAAA,IAAA,CAAQ,yBAAA,GAA2C,IAAA;AAEnD;AAAA,IAAA,IAAA,CAAQ,oBAAA,GAAsC,IAAA;AAE9C;AAAA,IAAA,IAAA,CAAQ,oBAAA,GAAsC,IAAA;AAE9C;AAAA,IAAA,IAAA,CAAQ,aAAA,GAAgB,KAAA;AAExB;AAAA,IAAA,IAAA,CAAQ,iBAAA,uBAAwB,GAAA,EAU9B;AAEF;AAAA,IAAA,IAAA,CAAQ,UAAA,GAAa,IAAA;AACrB,IAAA,IAAA,CAAQ,SAAA,GAAY,IAAA;AACpB,IAAA,IAAA,CAAQ,kBAAA,GAAyC,KAAA;AACjD,IAAA,IAAA,CAAQ,mBAAA,GAA2C,KAAA;AACnD,IAAA,IAAA,CAAQ,gCAAA,GAA2C,CAAA;AAEnD;AAAA,IAAA,IAAA,CAAQ,2BAAA,GAA0D,IAAA;AAClE,IAAA,IAAA,CAAiB,mBAAA,GAAsB,8BAAA;AAEvC;AAAA,IAAA,IAAA,CAAQ,UAAA,GAAyE,IAAA;AACjF,IAAA,IAAA,CAAQ,UAAA,GAAa,KAAA;AACrB,IAAA,IAAA,CAAQ,UAAA,GAAa,KAAA;AACrB,IAAA,IAAA,CAAQ,eAAA,GAAkB,CAAA;AAC1B,IAAA,IAAA,CAAQ,UAAA,GAAa,GAAA;AACrB,IAAA,IAAA,CAAQ,cAAA,GAAiB,EAAA;AACzB,IAAA,IAAA,CAAQ,aAAA,GAAgB,GAAA,GAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAC7C,IAAA,IAAA,CAAQ,iBAAA,GAAoB,EAAA;AAC5B,IAAA,IAAA,CAAQ,kBAAA,GAAqB,oBAAA;AAC7B,IAAA,IAAA,CAAQ,wBAAA,GAA+C,MAAA;AACvD,IAAA,IAAA,CAAQ,gBAAA,GAA2B,CAAA;AACnC,IAAA,IAAA,CAAQ,qBAAA,GAAiC,KAAA;AACzC,IAAA,IAAA,CAAQ,gBAAA,GAAmB,IAAA;AAC3B;AAAA,IAAA,IAAA,CAAQ,iBAAA,GAAoB,yBAAA;AAC5B,IAAA,IAAA,CAAQ,WAAA,GAAc,CAAA;AACtB,IAAA,IAAA,CAAQ,mBAAA,GAAsB,IAAA;AAE9B,IAAA,IAAA,CAAQ,qBAAA,GAAwB,KAAA;AAChC,IAAA,IAAA,CAAQ,sBAAA,GAAyB,KAAA;AACjC,IAAA,IAAA,CAAiB,uBAAA,GAA0B,gCAAA;AAC3C,IAAA,IAAA,CAAiB,2BAAA,GAA8B,iCAAA;AAC/C,IAAA,IAAA,CAAQ,gBAAA,GAA0C,IAAA;AAClD,IAAA,IAAA,CAAQ,eAAA,GAAyC,IAAA;AAEjD;AAAA,IAAA,IAAA,CAAQ,SAAA,GAAqC,IAAA;AA6/C7C;AAAA,IAAA,IAAA,CAAQ,gBAAA,GAAmB,KAAA;AAkoG3B,IAAA,IAAA,CAAQ,WAAA,GAAc,CAAC,CAAA,KAAwB;AAC3C,MAAA,IAAI,KAAK,sBAAA,EAAwB;AAEjC,MAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,iBAAiB,GAAA,EAAK;AAC5C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,WAAW,qBAAA,EAAsB;AAC3E,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,IAAA;AAC3B,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,GAAA;AAE3B,MAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,KAAK,cAAA,EAAe;AAC/C,MAAA,MAAM,aAAa,IAAA,CAAK,oBAAA,IAAwB,IAAA,CAAK,mBAAA,CAAoB,KAAK,QAAQ,CAAA;AAGtF,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,cAAA;AACrC,MAAA,MAAM,aAAA,GAAgB,CAAA,GAAI,MAAA,IAAU,CAAA,GAAI,SAAA;AAGxC,MAAA,MAAM,cAAc,IAAA,CAAK,YAAA,CAAa,gBAAgB,CAAA,EAAG,IAAA,CAAK,UAAU,MAAM,CAAA;AAC9E,MAAA,MAAM,QAAQ,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,CAAA,EAAG,YAAY,MAAM,CAAA;AAGlE,MAAA,MAAM,UAAU,IAAA,CAAK,GAAA;AAAA,QACjB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA;AAAA,QACnC,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,WAAW,CAAC;AAAA,OACvE;AACA,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA,IAAK,IAAA;AAE3C,MAAA,IAAA,CAAK,YACD,aAAA,IAAiB,CAAC,IAAA,CAAK,YAAA,EAAc,aAAa,IAAA,CAAK,kBAAA,KAAuB,IAAA,GACxE,EAAE,GAAG,CAAA,EAAG,QAAA,EAAU,OAAA,EAAS,KAAA,EAAO,KAAI,GACtC,IAAA;AACV,MAAA,IAAI,KAAK,SAAA,EAAW,IAAA,CAAK,QAAQ,IAAA,CAAK,WAAA,EAAa,KAAK,SAAS,CAAA;AAGjE,MAAA,MAAM,gBAAA,GACF,IAAA,CAAK,mBAAA,KAAwB,KAAA,IAAS,KAAK,iBAAA,KAAsB,IAAA;AACrE,MAAA,IAAI,KAAK,WAAA,EAAa;AAClB,QAAA,IACI,aAAA,IACA,KAAK,CAAA,IACL,CAAA,IAAK,UACL,CAAC,IAAA,CAAK,gBAAA,IACN,CAAC,gBAAA,EACH;AACE,UAAA,IAAA,CAAK,WAAA,CAAY,KAAK,CAAC,CAAA;AAEvB,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,WAAA,CAAY,IAAA,GAAO,CAAA;AAClD,UAAA,IAAI,uBAAA,CAAwB,CAAA,EAAG,QAAA,EAAU,IAAA,CAAK,mBAAmB,CAAA,EAAG;AAChE,YAAA,IAAA,CAAK,YAAY,IAAA,EAAK;AAAA,UAC1B,CAAA,MAAA,IAAW,KAAK,SAAA,EAAW;AACvB,YAAA,IAAA,CAAK,YAAY,IAAA,EAAK;AAAA,UAC1B;AACA,UAAA,IAAA,CAAK,qBAAA,GAAwB,EAAE,KAAA,EAAO,CAAA,EAAE;AAAA,QAC5C,CAAA,MAAO;AACH,UAAA,IAAA,CAAK,YAAY,IAAA,EAAK;AAAA,QAC1B;AAAA,MACJ;AAKA,MAAA,IAAI,KAAK,kBAAA,EAAoB;AACzB,QAAA,MAAM,EAAA,GAAK,CAAA,GAAI,IAAA,CAAK,kBAAA,CAAmB,MAAA;AACvC,QAAA,MAAM,EAAA,GAAK,CAAA,GAAI,IAAA,CAAK,kBAAA,CAAmB,MAAA;AACvC,QAAA,IAAI,IAAA,CAAK,KAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA,GAAI,aAAY,sBAAA,EAAwB;AACnE,UAAA,IAAA,CAAK,cAAA,CAAe,WAAA;AAAA,YAChB,KAAK,kBAAA,CAAmB,OAAA;AAAA,YACxB,KAAK,kBAAA,CAAmB;AAAA,WAC5B;AACA,UAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAAA,QAC9B;AAAA,MACJ;AACA,MAAA,IAAI,KAAK,gBAAA,EAAkB;AACvB,QAAA,MAAM,EAAA,GAAK,CAAA,GAAI,IAAA,CAAK,gBAAA,CAAiB,MAAA;AACrC,QAAA,MAAM,EAAA,GAAK,CAAA,GAAI,IAAA,CAAK,gBAAA,CAAiB,MAAA;AACrC,QAAA,IAAI,IAAA,CAAK,KAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA,GAAI,aAAY,sBAAA,EAAwB;AACnE,UAAA,IAAA,CAAK,cAAA,CAAe,SAAA;AAAA,YAChB,KAAK,gBAAA,CAAiB,OAAA;AAAA,YACtB,IAAA,CAAK,gBAAA,CAAiB,WAAA,EAAa,KAAK;AAAA,WAC5C;AACA,UAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,QAC5B;AAAA,MACJ;AAGA,MAAA,IAAA,CAAK,eAAe,WAAA,CAAY,IAAA,CAAK,gBAAA,CAAiB,WAAA,EAAa,KAAK,CAAC,CAAA;AAGzE,MAAA,IAAI,KAAK,QAAA,EAAU;AACf,QAAA,IAAI,IAAA,CAAK,QAAA,CAAS,IAAA,KAAS,OAAA,EAAS;AAEhC,UAAA,MAAM,KAAA,GAAQ,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAA;AAChC,UAAA,IAAA,CAAK,mBAAmB,IAAA,CAAK,GAAA;AAAA,YACzB,GAAA;AAAA,YACA,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,QAAA,CAAS,YAAY,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,KAAK,CAAC;AAAA,WACjE;AAAA,QACJ,WAAW,IAAA,CAAK,QAAA,CAAS,SAAS,SAAA,IAAa,IAAA,CAAK,SAAS,aAAA,EAAe;AAExE,UAAA,MAAM,KAAA,GAAQ,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAA;AAChC,UAAA,MAAM,YAAY,IAAA,CAAK,GAAA;AAAA,YACnB,GAAA;AAAA,YACA,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,QAAA,CAAS,YAAY,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,KAAK,CAAC;AAAA,WACjE;AACA,UAAA,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,eAAe,SAAS,CAAA;AAAA,QACvE,CAAA,MAAO;AAEH,UAAA,MAAM,KAAA,GAAQ,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAA;AAChC,UAAA,MAAM,aAAa,IAAA,CAAK,GAAA;AAAA,YACpB,EAAA;AAAA,YACA,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,KAAA,CAAM,KAAK,QAAA,CAAS,SAAA,GAAY,KAAA,GAAQ,GAAG,CAAC;AAAA,WACnE;AACA,UAAA,MAAM,OAAO,IAAA,CAAK,QAAA,CAAS,UAAA,GAAa,IAAA,CAAK,SAAS,QAAA,IAAY,CAAA;AAClE,UAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAM,aAAa,CAAC,CAAA;AACjD,UAAA,IAAA,CAAK,QAAA,GAAW;AAAA,YACZ,GAAG,IAAA,CAAK,QAAA;AAAA,YACR,UAAA,EAAY,QAAA;AAAA,YACZ,UAAU,QAAA,GAAW;AAAA,WACzB;AACA,UAAA,IAAA,CAAK,eAAA,GAAkB,EAAE,GAAG,IAAA,CAAK,QAAA,EAAS;AAAA,QAC9C;AACA,QAAA,IAAA,CAAK,WAAW,KAAA,CAAM,MAAA,GAClB,KAAK,QAAA,CAAS,IAAA,KAAS,SAAS,WAAA,GAAc,WAAA;AAClD,QAAA,IAAA,CAAK,cAAA,EAAe;AACpB,QAAA;AAAA,MACJ;AAGA,MAAA,IAAI,KAAK,aAAA,EAAe;AACpB,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,MAAA,GAAS,CAAA;AAC1C,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,aAAA,CAAc,MAAA,GAAS,KAAK,CAAC,CAAA;AAC1E,QAAA,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,IAAA,CAAK,aAAA,CAAc,eAAe,IAAI,CAAA;AACnE,QAAA,IAAA,CAAK,UAAA,CAAW,MAAM,MAAA,GAAS,WAAA;AAC/B,QAAA,IAAA,CAAK,cAAA,EAAe;AACpB,QAAA;AAAA,MACJ;AAKA,MAAA,IAAI,KAAK,iBAAA,EAAmB;AACxB,QAAA,MAAM,EAAA,GAAK,CAAA,GAAI,IAAA,CAAK,iBAAA,CAAkB,MAAA;AACtC,QAAA,MAAM,EAAA,GAAK,CAAA,GAAI,IAAA,CAAK,iBAAA,CAAkB,MAAA;AACtC,QAAA,IAAI,IAAA,CAAK,KAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA,GAAI,aAAY,0BAAA,EAA4B;AACvE,UAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAO,IAAA,KAAS,IAAA,CAAK,iBAAA;AACtC,UAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,UAAA,IAAA,CAAK,sBAAA,CAAuB,OAAA,EAAS,KAAA,EAAO,IAAI,CAAA;AAChD,UAAA,IAAA,CAAK,UAAA,CAAW,MAAM,MAAA,GAAS,WAAA;AAAA,QACnC,CAAA,MAAO;AACH,UAAA;AAAA,QACJ;AAAA,MACJ;AAGA,MAAA,IAAI,IAAA,CAAK,kBAAkB,MAAA,EAAQ;AAC/B,QAAA,MAAM,UAAA,GAAa,KAAK,gBAAA,CAAiB,WAAA;AAAA,UACrC,CAAA;AAAA,UACA,IAAA,CAAK,YAAA;AAAA,UACL,UAAA;AAAA,UACA;AAAA,SACJ;AACA,QAAA,IAAA,CAAK,iBAAA,GAAoB,YAAY,QAAA,IAAY,IAAA;AACjD,QAAA,IAAA,CAAK,mBAAA,GAAsB,YAAY,cAAA,IAAkB,IAAA;AACzD,QAAA,IAAA,CAAK,mBAAA,GAAsB,YAAY,cAAA,IAAkB,IAAA;AACzD,QAAA,IAAA,CAAK,UAAA,CAAW,MAAM,MAAA,GAAS,WAAA;AAC/B,QAAA,IAAA,CAAK,gBAAA,EAAiB;AAEtB,QAAA,IAAI,IAAA,CAAK,iBAAA,KAAsB,IAAA,IAAQ,UAAA,EAAY;AAC/C,UAAA,MAAM,QAAA,GAAW,UAAA,CAAW,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAC7C,UAAA,MAAM,SAAA,GACF,aAAa,EAAA,GAAK,UAAA,CAAW,MAAM,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,GAAI,UAAA,CAAW,KAAA;AACvE,UAAA,MAAM,WAAA,GACF,aAAa,EAAA,GACN,UAAA,CAAW,MAAM,KAAA,CAAM,QAAA,GAAW,CAAC,CAAA,GACpC,MAAA;AACV,UAAA,MAAM,aAAA,GAAgB,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,SAAS,CAAA;AACnE,UAAA,IAAI,aAAA,EAAe;AACf,YAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,gBAAA,EAAkB;AAAA,cAChC,OAAO,aAAA,CAAc,KAAA;AAAA,cACrB,UAAU,IAAA,CAAK,iBAAA;AAAA,cACf,MAAM,aAAA,CAAc,IAAA;AAAA,cACpB,WAAA;AAAA,cACA,GAAI,WAAW,cAAA,KAAmB,MAAA,GAC5B,EAAE,cAAA,EAAgB,UAAA,CAAW,cAAA,EAAe,GAC5C,EAAC;AAAA,cACP,GAAI,WAAW,cAAA,KAAmB,MAAA,GAC5B,EAAE,cAAA,EAAgB,UAAA,CAAW,cAAA,EAAe,GAC5C,EAAC;AAAA,cACP,cAAc,IAAA,CAAK;AAAA,aACtB,CAAA;AAAA,UACL;AAAA,QACJ;AACA,QAAA;AAAA,MACJ;AAGA,MAAA,IAAI,CAAC,IAAA,CAAK,cAAA,CAAe,aAAA,EAAc,EAAG;AAEtC,QAAA,IACI,mBAAA,CAAoB,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,iBAAiB,CAAA,IAChD,sBAAA,CAAuB,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,kBAAkB,CAAA,IACpD,qBAAA,CAAsB,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,mBAAmB,CAAA,IACpD,wBAAA,CAAyB,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,sBAAsB,CAAA,IAC1D,2BAAA,CAA4B,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,mBAAmB,CAAA,EAC5D;AACE,UAAA,IAAA,CAAK,UAAA,CAAW,MAAM,MAAA,GAAS,SAAA;AAC/B,UAAA,IAAA,CAAK,cAAA,EAAe;AACpB,UAAA;AAAA,QACJ;AAMA,QAAA,MAAM,SAAA,GAAY,qBAAA,CAAsB,CAAA,EAAG,CAAA,EAAG,KAAK,mBAAmB,CAAA;AACtE,QAAA,IAAI,SAAA,EAAW;AACX,UAAA,IAAA,CAAK,UAAA,CAAW,MAAM,MAAA,GAAS,WAAA;AAC/B,UAAA,IAAI,SAAA,CAAU,KAAA,KAAU,IAAA,CAAK,iBAAA,EAAmB;AAC5C,YAAA,IAAA,CAAK,oBAAoB,SAAA,CAAU,KAAA;AACnC,YAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,UAC1B;AACA,UAAA,IAAA,CAAK,cAAA,EAAe;AACpB,UAAA;AAAA,QACJ;AAGA,QAAA,MAAM,QAAA,GAAW,sBAAA,CAAuB,CAAA,EAAG,CAAA,EAAG,KAAK,eAAe,CAAA;AAClE,QAAA,MAAM,QAAA,GAAW,UAAU,KAAA,IAAS,IAAA;AACpC,QAAA,IAAI,QAAA,KAAa,KAAK,iBAAA,EAAmB;AACrC,UAAA,IAAA,CAAK,iBAAA,GAAoB,QAAA;AACzB,UAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,QAC1B;AAGA,QAAA,IAAI,IAAA,CAAK,mBAAA,KAAwB,KAAA,IAAS,QAAA,KAAa,IAAA,EAAM;AACzD,UAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,UAAA,IAAA,CAAK,UAAA,CAAW,MAAM,MAAA,GAAS,SAAA;AAC/B,UAAA,IAAA,CAAK,cAAA,EAAe;AACpB,UAAA;AAAA,QACJ;AAEA,QAAA,MAAM,IAAA,GAAO,KAAK,qBAAA,EAAsB;AACxC,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,IAAK,CAAC,CAAA;AACvD,QAAA,IAAI,OAAA,EAAS;AACT,UAAA,IAAA,CAAK,UAAA,CAAW,MAAM,MAAA,GAAS,WAAA;AAAA,QACnC,CAAA,MAAA,IAAW,KAAK,MAAA,EAAQ;AACpB,UAAA,IAAA,CAAK,UAAA,CAAW,MAAM,MAAA,GAAS,WAAA;AAAA,QACnC,CAAA,MAAA,IAAW,KAAK,SAAA,EAAW;AACvB,UAAA,IAAA,CAAK,UAAA,CAAW,MAAM,MAAA,GAAS,WAAA;AAAA,QACnC,CAAA,MAAA,IACI,KAAK,cAAA,CAAe,iBAAA,MACpB,IAAA,CAAK,cAAA,CAAe,mBAAkB,EACxC;AACE,UAAA,IAAA,CAAK,UAAA,CAAW,MAAM,MAAA,GAAS,UAAA;AAAA,QACnC,CAAA,MAAO;AACH,UAAA,MAAM,SAAA,GAAY,KAAK,cAAA,CAAe,gBAAA;AAAA,YAClC,CAAA;AAAA,YACA,CAAA;AAAA,YACA,IAAA,CAAK,YAAA;AAAA,YACL,IAAA,CAAK,QAAA;AAAA,YACL,UAAA;AAAA,YACA,MAAA;AAAA,YACA;AAAA,WACJ;AACA,UAAA,IAAI,SAAA,EAAW;AACX,YAAA,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,MAAA,GAAS,SAAA,CAAU,MAAA,CAAO,MAAA;AAAA,UACpD,CAAA,MAAO;AACH,YAAA,MAAM,OAAA,GAAU,KAAK,cAAA,CAAe,OAAA;AAAA,cAChC,CAAA;AAAA,cACA,CAAA;AAAA,cACA,IAAA,CAAK,YAAA;AAAA,cACL,IAAA,CAAK,QAAA;AAAA,cACL,UAAA;AAAA,cACA,MAAA;AAAA,cACA;AAAA,aACJ;AACA,YAAA,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,MAAA,GAAS,OAAA,GAAU,MAAA,GAAS,SAAA;AAAA,UACtD;AAAA,QACJ;AAAA,MACJ;AAEA,MAAA,IAAA,CAAK,cAAA,EAAe;AAAA,IACxB,CAAA;AAEA,IAAA,IAAA,CAAQ,YAAA,GAAe,CAAC,CAAA,KAAwB;AAG5C,MAAA,IAAI,IAAA,CAAK,eAAe,IAAA,CAAK,WAAA,CAAY,GAAG,QAAA,CAAS,CAAA,CAAE,aAA4B,CAAA,EAAG;AAClF,QAAA;AAAA,MACJ;AAEA,MAAA,IAAI,KAAK,sBAAA,EAAwB;AACjC,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,MAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AACxB,QAAA,IAAA,CAAK,aAAa,IAAA,EAAK;AAAA,MAC3B;AACA,MAAA,IAAI,IAAA,CAAK,sBAAsB,IAAA,EAAM;AACjC,QAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,QAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,MAC1B;AACA,MAAA,IAAA,CAAK,cAAA,EAAe;AAAA,IACxB,CAAA;AAEA,IAAA,IAAA,CAAQ,YAAY,MAAY;AAI5B,MAAA,IAAI,KAAK,iBAAA,EAAmB;AACxB,QAAA,MAAM,EAAE,KAAA,EAAM,GAAI,IAAA,CAAK,iBAAA;AACvB,QAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAKzB,QAAA,IACI,IAAA,CAAK,cAAA,KAAmB,KAAA,CAAM,KAAA,IAC9B,CAAC,KAAK,iBAAA,CAAkB,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA,EACzC;AACE,UAAA,IAAA,CAAK,sBAAA,CAAuB,MAAM,KAAK,CAAA;AACvC,UAAA;AAAA,QACJ;AACA,QAAA,IAAA,CAAK,wBAAwB,KAAK,CAAA;AAClC,QAAA;AAAA,MACJ;AACA,MAAA,IAAI,IAAA,CAAK,kBAAkB,MAAA,EAAQ;AAC/B,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,gBAAA,CAAiB,OAAA,EAAQ;AAC7C,QAAA,IAAI,MAAA,EAAQ;AACR,UAAA,IAAA,CAAK,6BAAA;AAAA,YACD,MAAA;AAAA,YACA,KAAK,yBAAA,IAA6B;AAAA,WACtC;AAAA,QACJ,CAAA,MAAO;AACH,UAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAAA,QAC7B;AACA,QAAA,IAAA,CAAK,yBAAA,GAA4B,IAAA;AACjC,QAAA,IAAA,CAAK,UAAA,CAAW,MAAM,MAAA,GAAS,SAAA;AAC/B,QAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,QAAA;AAAA,MACJ;AACA,MAAA,IAAI,KAAK,QAAA,EAAU;AACf,QAAA,MAAM,eAAe,IAAA,CAAK,QAAA,CAAS,SAAS,OAAA,IAAW,IAAA,CAAK,SAAS,IAAA,KAAS,MAAA;AAC9E,QAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,QAAA,IAAA,CAAK,UAAA,CAAW,MAAM,MAAA,GAAS,SAAA;AAC/B,QAAA,IAAA,CAAK,cAAA,EAAe;AACpB,QAAA,IAAI,YAAA,OAAmB,uBAAA,EAAwB;AAAA,MACnD;AACA,MAAA,IAAI,KAAK,aAAA,EAAe;AACpB,QAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,QAAA,IAAA,CAAK,UAAA,CAAW,MAAM,MAAA,GAAS,SAAA;AAC/B,QAAA,IAAA,CAAK,cAAA,EAAe;AAAA,MACxB;AAEA,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,MAAA,IAAI,IAAA,CAAK,cAAA,CAAe,iBAAA,EAAkB,EAAG;AACzC,QAAA,IAAA,CAAK,eAAe,OAAA,EAAQ;AAC5B,QAAA,IAAA,CAAK,UAAA,CAAW,MAAM,MAAA,GAAS,SAAA;AAC/B,QAAA,IAAA,CAAK,cAAA,EAAe;AAAA,MACxB;AACA,MAAA,IAAI,IAAA,CAAK,cAAA,CAAe,iBAAA,EAAkB,EAAG;AACzC,QAAA,IAAA,CAAK,eAAe,SAAA,EAAU;AAC9B,QAAA,IAAA,CAAK,UAAA,CAAW,MAAM,MAAA,GAAS,SAAA;AAC/B,QAAA,IAAA,CAAK,cAAA,EAAe;AAAA,MACxB;AAAA,IACJ,CAAA;AAgVA,IAAA,IAAA,CAAQ,mBAAA,GAAsB,CAAC,CAAA,KAAwB;AACnD,MAAA,IAAI,CAAA,CAAE,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAC5B,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AACzB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA;AAC5C,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,aAAA,EAAc;AACrD,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,SAAA,EAAU;AAG9C,MAAA,IAAI,UAAA,KAAe,QAAQ,OAAA,EAAS;AAChC,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAA,CAAK,sBAAA,GAAyB,KAAA;AAC9B,QAAA,IAAI,CAAC,OAAA,EAAS;AAEV,UAAA,IAAA,CAAK,cAAA,CAAe,YAAY,KAAK,CAAA;AACrC,UAAA,IAAA,CAAK,sBAAA,GAAyB,IAAA,CAAK,cAAA,CAAe,SAAA,EAAU;AAAA,QAChE,CAAA,MAAO;AAGH,UAAA,IAAA,CAAK,sBAAA,GAAyB,KAAA;AAC9B,UAAA,IAAA,CAAK,cAAA,CAAe,YAAY,KAAK,CAAA;AAAA,QACzC;AACA,QAAA,IAAA,CAAK,cAAA,EAAe;AACpB,QAAA;AAAA,MACJ;AAGA,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,WAAW,qBAAA,EAAsB;AAC3E,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,IAAA;AAC/B,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,GAAA;AAC/B,MAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,KAAK,cAAA,EAAe;AAC/C,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,mBAAA,CAAoB,IAAA,CAAK,QAAQ,CAAA;AAGzD,MAAA,IAAI,KAAK,MAAA,EAAQ;AACb,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAI,KAAK,MAAA,EAAQ;AACb,UAAA,IAAA,CAAK,QAAA,GAAW,EAAE,IAAA,EAAM,OAAA,EAAS,UAAU,CAAA,EAAG,SAAA,EAAW,KAAK,gBAAA,EAAiB;AAAA,QACnF,CAAA,MAAO;AACH,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CACjB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,CAAU,IAAA,KAAS,KAAK,CAAA,CACxC,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AAC3B,UAAA,IAAI,UAAU,MAAA,GAAS,cAAA;AACvB,UAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AACxB,YAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACzB,YAAA,IAAI,CAAA,IAAK,OAAA,IAAW,CAAA,GAAI,OAAA,GAAU,EAAA,EAAI;AAClC,cAAA,IAAA,CAAK,QAAA,GAAW;AAAA,gBACZ,IAAA,EAAM,SAAA;AAAA,gBACN,QAAA,EAAU,CAAA;AAAA,gBACV,WAAW,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,IAAK,CAAA;AAAA,gBACrD,eAAe,GAAA,CAAI;AAAA,eACvB;AACA,cAAA;AAAA,YACJ;AACA,YAAA,OAAA,IAAW,EAAA,GAAK,cAAA;AAAA,UACpB;AAAA,QACJ;AACA,QAAA,IAAA,CAAK,cAAA,EAAe;AACpB,QAAA;AAAA,MACJ;AAEA,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,cAAA;AACrC,MAAA,IAAI,KAAK,SAAA,EAAW;AAChB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAA,CAAK,QAAA,GAAW;AAAA,UACZ,IAAA,EAAM,MAAA;AAAA,UACN,QAAA,EAAU,CAAA;AAAA,UACV,SAAA,EAAW,IAAA,CAAK,QAAA,CAAS,QAAA,GAAW,KAAK,QAAA,CAAS;AAAA,SACtD;AACA,QAAA,IAAA,CAAK,cAAA,EAAe;AACpB,QAAA;AAAA,MACJ;AAEA,MAAA,MAAM,SAAA,GAAY,KAAK,cAAA,CAAe,gBAAA;AAAA,QAClC,CAAA;AAAA,QACA,CAAA;AAAA,QACA,IAAA,CAAK,YAAA;AAAA,QACL,IAAA,CAAK,QAAA;AAAA,QACL,UAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACJ;AACA,MAAA,IAAI,SAAA,EAAW;AACX,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAA,CAAK,WAAW,MAAA,EAAO;AACvB,QAAA,IAAA,CAAK,cAAA,CAAe,aAAA,CAAc,SAAA,CAAU,OAAO,CAAA;AACnD,QAAA,IAAA,CAAK,eAAe,WAAA,CAAY,SAAA,CAAU,OAAA,EAAS,SAAA,CAAU,OAAO,UAAU,CAAA;AAC9E,QAAA,IAAA,CAAK,uBAAA,EAAwB;AAC7B,QAAA,IAAA,CAAK,cAAA,EAAe;AACpB,QAAA;AAAA,MACJ;AAEA,MAAA,MAAM,OAAA,GAAU,KAAK,cAAA,CAAe,OAAA;AAAA,QAChC,CAAA;AAAA,QACA,CAAA;AAAA,QACA,IAAA,CAAK,YAAA;AAAA,QACL,IAAA,CAAK,QAAA;AAAA,QACL,UAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,OACJ;AACA,MAAA,IAAI,OAAA,EAAS;AACT,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAA,CAAK,WAAW,MAAA,EAAO;AACvB,QAAA,IAAA,CAAK,cAAA,CAAe,cAAc,OAAO,CAAA;AACzC,QAAA,IAAA,CAAK,cAAA,CAAe,SAAA,CAAU,OAAA,EAAS,KAAK,CAAA;AAC5C,QAAA,IAAA,CAAK,oBAAoB,EAAE,CAAA,EAAG,MAAM,OAAA,EAAS,CAAA,EAAG,MAAM,OAAA,EAAQ;AAC9D,QAAA,IAAA,CAAK,uBAAA,EAAwB;AAC7B,QAAA,IAAA,CAAK,cAAA,EAAe;AACpB,QAAA;AAAA,MACJ;AAGA,MAAA,MAAM,eAAA,GAAkB,mBAAA,CAAoB,CAAA,EAAG,CAAA,EAAG,KAAK,iBAAiB,CAAA;AACxE,MAAA,IAAI,eAAA,EAAiB;AACjB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAA,CAAK,WAAW,MAAA,EAAO;AACvB,QAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AACtD,UAAA,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAO,eAAA,CAAgB,SAAS,CAAA;AAAA,QAC1D,CAAA,MAAO;AACH,UAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,eAAA,CAAgB,SAAS,CAAA;AAAA,QACvD;AACA,QAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,QAAA;AAAA,MACJ;AAGA,MAAA,MAAM,QAAA,GAAW,2BAAA,CAA4B,CAAA,EAAG,CAAA,EAAG,KAAK,mBAAmB,CAAA;AAC3E,MAAA,IAAI,QAAA,EAAU;AACV,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAA,CAAK,WAAW,MAAA,EAAO;AACvB,QAAA,IAAA,CAAK,mBAAA,CAAoB,SAAS,WAAW,CAAA;AAC7C,QAAA;AAAA,MACJ;AAGA,MAAA,MAAM,UAAA,GAAa,wBAAA,CAAyB,CAAA,EAAG,CAAA,EAAG,KAAK,sBAAsB,CAAA;AAC7E,MAAA,IAAI,UAAA,EAAY;AACZ,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAI,WAAW,MAAA,KAAW,SAAA,EAAW,IAAA,CAAK,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAAA,aACzE,IAAA,CAAK,oBAAA,CAAqB,UAAA,CAAW,KAAK,CAAA;AAC/C,QAAA;AAAA,MACJ;AAGA,MAAA,IAAI,IAAA,CAAK,kBAAA,IAAsB,IAAA,CAAK,iBAAA,EAAmB;AACnD,QAAA,MAAM,IAAI,IAAA,CAAK,iBAAA;AACf,QAAA,IAAI,CAAA,IAAK,CAAA,CAAE,KAAA,IAAS,CAAA,IAAK,EAAE,KAAA,GAAQ,CAAA,CAAE,KAAA,IAAS,CAAA,IAAK,EAAE,KAAA,IAAS,CAAA,IAAK,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAA,EAAO;AAClF,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,UAAA,IAAA,CAAK,mBAAmB,CAAC,CAAA;AACzB,UAAA;AAAA,QACJ;AAAA,MACJ;AAGA,MAAA,MAAM,QAAA,GAAW,sBAAA,CAAuB,CAAA,EAAG,CAAA,EAAG,KAAK,kBAAkB,CAAA;AACrE,MAAA,IAAI,QAAA,EAAU;AACV,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAA,CAAK,uBAAuB,QAAQ,CAAA;AACpC,QAAA;AAAA,MACJ;AAOA,MAAA,IAAI,CAAC,IAAA,CAAK,cAAA,CAAe,aAAA,EAAc,EAAG;AACtC,QAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,CAAA,EAAG,CAAA,EAAG,KAAK,mBAAmB,CAAA;AACpE,QAAA,IAAI,OAAA,EAAS;AACT,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,OAAA,CAAQ,KAAK,CAAA;AAC/D,UAAA,IAAI,KAAA,EAAO,IAAA,CAAK,uBAAA,CAAwB,KAAK,CAAA;AAC7C,UAAA;AAAA,QACJ;AAAA,MACJ;AAGA,MAAA,IAAI,KAAK,gBAAA,IAAoB,CAAC,IAAA,CAAK,cAAA,CAAe,eAAc,EAAG;AAC/D,QAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,CAAA,EAAG,CAAA,EAAG,KAAK,mBAAmB,CAAA;AACpE,QAAA,IAAI,OAAA,EAAS;AACT,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,OAAA,CAAQ,KAAK,CAAA;AAC/D,UAAA,IAAI,KAAA,EAAO;AAOP,YAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,kBAAA,KAAuB,KAAA,CAAM,KAAA;AAC5D,YAAA,MAAM,iBAAA,GACF,OAAA,CAAQ,SAAA,IACP,KAAA,CAAM,IAAA,KAAS,SAAA,IACX,KAAA,CAA4B,SAAA,KAAc,QAAA,KAC1C,iBAAA,IAAqB,CAAE,OAAA,CAA+B,KAAA,CAAA;AAC/D,YAAA,IAAI,IAAA,CAAK,sBAAA,IAA0B,CAAC,iBAAA,EAAmB;AACnD,cAAA,MAAM,UAAA,GAAa,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,MAAM,KAAK,CAAA;AACzD,cAAA,IAAI,IAAA,CAAK,kBAAA,KAAuB,KAAA,CAAM,KAAA,IAAS,CAAC,UAAA,EAAY;AACxD,gBAAA,IAAA,CAAK,sBAAA,CAAuB,MAAM,KAAK,CAAA;AACvC,gBAAA;AAAA,cACJ;AACA,cAAA,IAAA,CAAK,wBAAwB,KAAK,CAAA;AAClC,cAAA;AAAA,YACJ;AACA,YAAA,IAAA,CAAK,sBAAA,CAAuB,OAAA,EAAS,KAAA,EAAO,CAAC,CAAA;AAC7C,YAAA,IAAA,CAAK,cAAA,EAAe;AACpB,YAAA;AAAA,UACJ;AAAA,QACJ;AAEA,QAAA,MAAM,MAAA,GAAS,2BAAA,CAA4B,CAAA,EAAG,CAAA,EAAG,KAAK,oBAAoB,CAAA;AAC1E,QAAA,IAAI,MAAA,EAAQ;AACR,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,IAAA,CAAK,uBAAA,CAAwB,QAAQ,CAAC,CAAA;AACtC,UAAA,IAAA,CAAK,cAAA,EAAe;AACpB,UAAA;AAAA,QACJ;AAAA,MACJ;AAQA,MAAA,IAAI,KAAK,gBAAA,IAAoB,CAAC,IAAA,CAAK,cAAA,CAAe,eAAc,EAAG;AAC/D,QAAA,MAAM,QAAA,GAAW,sBAAA,CAAuB,CAAA,EAAG,CAAA,EAAG,KAAK,eAAe,CAAA;AAClE,QAAA,IAAI,QAAA,EAAU;AACV,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,QAAA,CAAS,KAAK,CAAA;AAChE,UAAA,IAAI,KAAA,EAAO;AACP,YAAA,MAAM,UAAA,GAAa,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,SAAS,KAAK,CAAA;AAC5D,YAAA,IAAI,IAAA,CAAK,kBAAA,KAAuB,QAAA,CAAS,KAAA,IAAS,CAAC,UAAA,EAAY;AAC3D,cAAA,IAAA,CAAK,sBAAA,CAAuB,SAAS,KAAK,CAAA;AAC1C,cAAA;AAAA,YACJ;AACA,YAAA,IAAA,CAAK,wBAAwB,KAAK,CAAA;AAClC,YAAA;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAGA,MAAA,IAAA,CAAK,cAAA,CAAe,cAAc,IAAI,CAAA;AACtC,MAAA,IAAA,CAAK,uBAAA,EAAwB;AAC7B,MAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,IAAA,GAAO,CAAA,EAAG;AAChC,QAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAC5B,QAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,MAC1B;AAIA,MAAA,MAAM,aAAA,GAAgB,CAAA,GAAI,MAAA,IAAU,CAAA,GAAI,SAAA;AACxC,MAAA,IAAI,aAAA,EAAe;AACf,QAAA,IAAI,KAAK,sBAAA,EAAwB;AAE7B,UAAA,IAAI,IAAA,CAAK,oBAAoB,IAAA,EAAM;AAC/B,YAAA,YAAA,CAAa,KAAK,eAAe,CAAA;AACjC,YAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,UAC3B;AACA,UAAA,IAAA,CAAK,iBAAA,GAAoB,EAAE,CAAA,EAAG,CAAA,EAAE;AAAA,QACpC,CAAA,MAAO;AAEH,UAAA,IAAI,IAAA,CAAK,eAAA,KAAoB,IAAA,EAAM,YAAA,CAAa,KAAK,eAAe,CAAA;AACpE,UAAA,IAAA,CAAK,eAAA,GAAkB,EAAE,CAAA,EAAG,CAAA,EAAE;AAC9B,UAAA,IAAA,CAAK,eAAA,GAAkB,WAAW,MAAM;AACpC,YAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,YAAA,IAAI,KAAK,eAAA,EAAiB;AACtB,cAAA,IAAA,CAAK,wBAAA;AAAA,gBACD,KAAK,eAAA,CAAgB,CAAA;AAAA,gBACrB,KAAK,eAAA,CAAgB;AAAA,eACzB;AACA,cAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,YAC3B;AAAA,UACJ,GAAG,GAAG,CAAA;AAAA,QACV;AAAA,MACJ;AAAA,IACJ,CAAA;AAEA,IAAA,IAAA,CAAQ,kBAAA,GAAqB,CAAC,CAAA,KAAwB;AAClD,MAAA,IAAI,CAAA,CAAE,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAC5B,MAAA,MAAM,QAAQ,IAAA,CAAK,mBAAA,CAAoB,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA;AACnD,MAAA,IAAA,CAAK,sBAAA,GAAyB,KAAA;AAG9B,MAAA,IAAI,KAAK,QAAA,EAAU;AACf,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AACzB,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,WAAW,qBAAA,EAAsB;AAC3E,QAAA,MAAM,EAAA,GAAK,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,IAAA;AAChC,QAAA,MAAM,EAAA,GAAK,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,GAAA;AAChC,QAAA,IAAI,IAAA,CAAK,QAAA,CAAS,IAAA,KAAS,OAAA,EAAS;AAChC,UAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,IAAA,CAAK,QAAA,CAAS,QAAA;AACjC,UAAA,IAAA,CAAK,mBAAmB,IAAA,CAAK,GAAA;AAAA,YACzB,GAAA;AAAA,YACA,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,QAAA,CAAS,YAAY,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,KAAK,CAAC;AAAA,WACjE;AAAA,QACJ,WAAW,IAAA,CAAK,QAAA,CAAS,SAAS,SAAA,IAAa,IAAA,CAAK,SAAS,aAAA,EAAe;AACxE,UAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,IAAA,CAAK,QAAA,CAAS,QAAA;AACjC,UAAA,MAAM,YAAY,IAAA,CAAK,GAAA;AAAA,YACnB,GAAA;AAAA,YACA,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,QAAA,CAAS,YAAY,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,KAAK,CAAC;AAAA,WACjE;AACA,UAAA,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,eAAe,SAAS,CAAA;AAAA,QACvE,CAAA,MAAO;AACH,UAAA,MAAM,KAAA,GAAQ,EAAA,GAAK,IAAA,CAAK,QAAA,CAAS,QAAA;AACjC,UAAA,MAAM,aAAa,IAAA,CAAK,GAAA;AAAA,YACpB,EAAA;AAAA,YACA,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,KAAA,CAAM,KAAK,QAAA,CAAS,SAAA,GAAY,KAAA,GAAQ,GAAG,CAAC;AAAA,WACnE;AACA,UAAA,MAAM,OAAO,IAAA,CAAK,QAAA,CAAS,UAAA,GAAa,IAAA,CAAK,SAAS,QAAA,IAAY,CAAA;AAClE,UAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAA,GAAM,aAAa,CAAC,CAAA;AACjD,UAAA,IAAA,CAAK,QAAA,GAAW;AAAA,YACZ,GAAG,IAAA,CAAK,QAAA;AAAA,YACR,UAAA,EAAY,QAAA;AAAA,YACZ,UAAU,QAAA,GAAW;AAAA,WACzB;AAAA,QACJ;AACA,QAAA,IAAA,CAAK,cAAA,EAAe;AACpB,QAAA;AAAA,MACJ;AAGA,MAAA,IAAI,KAAK,cAAA,CAAe,SAAA,EAAU,IAAK,CAAC,KAAK,sBAAA,EAAwB;AACjE,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAA,CAAK,cAAA,CAAe,YAAY,KAAK,CAAA;AACrC,QAAA,IAAA,CAAK,cAAA,EAAe;AACpB,QAAA;AAAA,MACJ;AAGA,MAAA,IAAI,KAAK,cAAA,CAAe,iBAAA,MAAuB,IAAA,CAAK,cAAA,CAAe,mBAAkB,EAAG;AACpF,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,IAAA,CAAK,cAAA,CAAe,YAAY,KAAK,CAAA;AACrC,QAAA,IAAA,CAAK,cAAA,EAAe;AACpB,QAAA;AAAA,MACJ;AAGA,MAAA,IAAI,IAAA,CAAK,kBAAkB,MAAA,EAAQ;AAC/B,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AACzB,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,WAAW,qBAAA,EAAsB;AAC3E,QAAA,MAAM,EAAA,GAAK,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,GAAA;AAChC,QAAA,MAAM,EAAE,MAAA,EAAO,GAAI,IAAA,CAAK,cAAA,EAAe;AACvC,QAAA,MAAM,aAAa,IAAA,CAAK,oBAAA,IAAwB,IAAA,CAAK,mBAAA,CAAoB,KAAK,QAAQ,CAAA;AACtF,QAAA,MAAM,UAAA,GAAa,KAAK,gBAAA,CAAiB,WAAA;AAAA,UACrC,EAAA;AAAA,UACA,IAAA,CAAK,YAAA;AAAA,UACL,UAAA;AAAA,UACA;AAAA,SACJ;AACA,QAAA,IAAA,CAAK,iBAAA,GAAoB,YAAY,QAAA,IAAY,IAAA;AACjD,QAAA,IAAA,CAAK,mBAAA,GAAsB,YAAY,cAAA,IAAkB,IAAA;AACzD,QAAA,IAAA,CAAK,mBAAA,GAAsB,YAAY,cAAA,IAAkB,IAAA;AACzD,QAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,QAAA,IAAI,IAAA,CAAK,iBAAA,KAAsB,IAAA,IAAQ,UAAA,EAAY;AAC/C,UAAA,MAAM,QAAA,GAAW,UAAA,CAAW,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAC7C,UAAA,MAAM,SAAA,GACF,aAAa,EAAA,GAAK,UAAA,CAAW,MAAM,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,GAAI,UAAA,CAAW,KAAA;AACvE,UAAA,MAAM,WAAA,GACF,aAAa,EAAA,GACN,UAAA,CAAW,MAAM,KAAA,CAAM,QAAA,GAAW,CAAC,CAAA,GACpC,MAAA;AACV,UAAA,MAAM,aAAA,GAAgB,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,SAAS,CAAA;AACnE,UAAA,IAAI,aAAA,EAAe;AACf,YAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,gBAAA,EAAkB;AAAA,cAChC,OAAO,aAAA,CAAc,KAAA;AAAA,cACrB,UAAU,IAAA,CAAK,iBAAA;AAAA,cACf,MAAM,aAAA,CAAc,IAAA;AAAA,cACpB,WAAA;AAAA,cACA,GAAI,WAAW,cAAA,KAAmB,MAAA,GAC5B,EAAE,cAAA,EAAgB,UAAA,CAAW,cAAA,EAAe,GAC5C,EAAC;AAAA,cACP,GAAI,WAAW,cAAA,KAAmB,MAAA,GAC5B,EAAE,cAAA,EAAgB,UAAA,CAAW,cAAA,EAAe,GAC5C,EAAC;AAAA,cACP,cAAc,IAAA,CAAK;AAAA,aACtB,CAAA;AAAA,UACL;AAAA,QACJ;AACA,QAAA;AAAA,MACJ;AAIA,MAAA,IAAI,IAAA,CAAK,iBAAA,IAAqB,IAAA,CAAK,eAAA,KAAoB,IAAA,EAAM;AACzD,QAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AACzB,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,WAAW,qBAAA,EAAsB;AAC3E,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,iBAAA,IAAqB,IAAA,CAAK,eAAA;AACjD,QAAA,IAAI,SAAA,EAAW;AACX,UAAA,MAAM,EAAA,GAAK,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,OAAO,SAAA,CAAU,CAAA;AACjD,UAAA,MAAM,EAAA,GAAK,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,MAAM,SAAA,CAAU,CAAA;AAChD,UAAA,IAAI,KAAK,IAAA,CAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAE,IAAI,CAAA,EAAG;AAClC,YAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,YAAA,IAAI,IAAA,CAAK,oBAAoB,IAAA,EAAM;AAC/B,cAAA,YAAA,CAAa,KAAK,eAAe,CAAA;AACjC,cAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,cAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,YAC3B;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAGA,MAAA,IAAI,KAAK,sBAAA,EAAwB;AAC7B,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AACzB,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,WAAW,qBAAA,EAAsB;AAC3E,QAAA,MAAM,CAAA,GAAI,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,IAAA;AAC/B,QAAA,MAAM,CAAA,GAAI,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,GAAA;AAC/B,QAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,KAAK,cAAA,EAAe;AAC/C,QAAA,MAAM,aAAa,IAAA,CAAK,oBAAA,IAAwB,IAAA,CAAK,mBAAA,CAAoB,KAAK,QAAQ,CAAA;AACtF,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,cAAA;AACrC,QAAA,IAAI,CAAA,GAAI,MAAA,IAAU,CAAA,GAAI,SAAA,EAAW;AAC7B,UAAA,MAAM,cAAc,IAAA,CAAK,YAAA,CAAa,gBAAgB,CAAA,EAAG,IAAA,CAAK,UAAU,MAAM,CAAA;AAC9E,UAAA,MAAM,QAAQ,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,CAAA,EAAG,YAAY,MAAM,CAAA;AAClE,UAAA,MAAM,UAAU,IAAA,CAAK,GAAA;AAAA,YACjB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA;AAAA,YACnC,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,WAAW,CAAC;AAAA,WACvE;AACA,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA,IAAK,IAAA;AAC3C,UAAA,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,kBAAA,KAAuB,IAAA,GACvC,EAAE,CAAA,EAAG,CAAA,EAAG,QAAA,EAAU,OAAA,EAAS,KAAA,EAAO,GAAA,EAAI,GACtC,IAAA;AACN,UAAA,IAAI,KAAK,WAAA,EAAa;AAClB,YAAA,IAAA,CAAK,WAAA,CAAY,KAAK,CAAC,CAAA;AACvB,YAAA,IAAI,KAAK,gBAAA,EAAkB;AACvB,cAAA,IAAA,CAAK,YAAY,IAAA,EAAK;AAAA,YAC1B,CAAA,MAAO;AACH,cAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,WAAA,CAAY,IAAA,GAAO,CAAA;AACpD,cAAA,IAAI,uBAAA,CAAwB,CAAA,EAAG,UAAA,EAAY,IAAA,CAAK,mBAAmB,CAAA,EAAG;AAClE,gBAAA,IAAA,CAAK,YAAY,IAAA,EAAK;AAAA,cAC1B,CAAA,MAAA,IAAW,KAAK,SAAA,EAAW;AACvB,gBAAA,IAAA,CAAK,YAAY,IAAA,EAAK;AAAA,cAC1B;AAAA,YACJ;AACA,YAAA,IAAA,CAAK,qBAAA,GAAwB,EAAE,KAAA,EAAO,CAAA,EAAE;AAAA,UAC5C;AACA,UAAA,IAAA,CAAK,cAAA,EAAe;AAAA,QACxB;AAAA,MACJ;AAAA,IACJ,CAAA;AAEA,IAAA,IAAA,CAAQ,iBAAA,GAAoB,CAAC,EAAA,KAAyB;AAClD,MAAA,IAAA,CAAK,cAAA,GAAiB,KAAK,GAAA,EAAI;AAE/B,MAAA,IAAI,IAAA,CAAK,oBAAoB,IAAA,EAAM;AAC/B,QAAA,YAAA,CAAa,KAAK,eAAe,CAAA;AACjC,QAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,QAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,MAC3B;AAGA,MAAA,IAAI,IAAA,CAAK,kBAAkB,MAAA,EAAQ;AAC/B,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,gBAAA,CAAiB,OAAA,EAAQ;AAC7C,QAAA,IAAI,MAAA,EAAQ;AACR,UAAA,IAAA,CAAK,6BAAA;AAAA,YACD,MAAA;AAAA,YACA,KAAK,yBAAA,IAA6B;AAAA,WACtC;AAAA,QACJ,CAAA,MAAO;AACH,UAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAAA,QAC7B;AACA,QAAA,IAAA,CAAK,yBAAA,GAA4B,IAAA;AACjC,QAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,QAAA;AAAA,MACJ;AAEA,MAAA,IAAI,KAAK,QAAA,EAAU;AACf,QAAA,MAAM,eAAe,IAAA,CAAK,QAAA,CAAS,SAAS,OAAA,IAAW,IAAA,CAAK,SAAS,IAAA,KAAS,MAAA;AAC9E,QAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,QAAA,IAAA,CAAK,cAAA,EAAe;AACpB,QAAA,IAAI,YAAA,OAAmB,uBAAA,EAAwB;AAC/C,QAAA;AAAA,MACJ;AAEA,MAAA,MAAM,iBAAiB,IAAA,CAAK,sBAAA;AAC5B,MAAA,IAAA,CAAK,sBAAA,GAAyB,KAAA;AAG9B,MAAA,IAAI,CAAC,cAAA,IAAkB,IAAA,CAAK,eAAe,SAAA,EAAU,IAAK,KAAK,sBAAA,EAAwB;AACnF,QAAA,IAAA,CAAK,cAAA,CAAe,WAAA,CAAY,IAAA,CAAK,sBAAsB,CAAA;AAC3D,QAAA,IAAA,CAAK,sBAAA,GAAyB,IAAA;AAC9B,QAAA,IAAA,CAAK,cAAA,EAAe;AACpB,QAAA;AAAA,MACJ;AAGA,MAAA,IAAI,IAAA,CAAK,cAAA,CAAe,iBAAA,EAAkB,EAAG;AACzC,QAAA,MAAM,QAAA,GAAW,EAAA,CAAG,cAAA,CAAe,CAAC,CAAA;AACpC,QAAA,MAAM,UAAU,IAAA,CAAK,iBAAA;AACrB,QAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,QAAA,IAAA,CAAK,eAAe,OAAA,EAAQ;AAG5B,QAAA,IAAI,QAAA,IAAY,OAAA,IAAW,IAAA,CAAK,cAAA,CAAe,oBAAmB,EAAG;AACjE,UAAA,MAAM,EAAA,GAAK,QAAA,CAAS,OAAA,GAAU,OAAA,CAAQ,CAAA;AACtC,UAAA,MAAM,EAAA,GAAK,QAAA,CAAS,OAAA,GAAU,OAAA,CAAQ,CAAA;AACtC,UAAA,IAAI,KAAK,IAAA,CAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAE,IAAI,CAAA,EAAG;AAClC,YAAA,IAAA,CAAK,uBAAA,CAAwB,QAAA,CAAS,OAAA,EAAS,QAAA,CAAS,OAAO,CAAA;AAAA,UACnE;AAAA,QACJ;AACA,QAAA,IAAA,CAAK,cAAA,EAAe;AAAA,MACxB;AACA,MAAA,IAAI,IAAA,CAAK,cAAA,CAAe,iBAAA,EAAkB,EAAG;AACzC,QAAA,IAAA,CAAK,eAAe,SAAA,EAAU;AAC9B,QAAA,IAAA,CAAK,cAAA,EAAe;AAAA,MACxB;AAIA,MAAA,IAAI,KAAK,iBAAA,EAAmB;AACxB,QAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAEzB,QAAA,IAAA,CAAK,sBAAA,GAAyB,KAAA;AAC9B,QAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,QAAA,IAAA,CAAK,aAAa,IAAA,EAAK;AACvB,QAAA,IAAA,CAAK,cAAA,EAAe;AAAA,MACxB;AAAA,IACJ,CAAA;AAEA,IAAA,IAAA,CAAQ,aAAA,GAAgB,CAAC,CAAA,KAAwB;AAC7C,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,WAAW,qBAAA,EAAsB;AAC3E,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,IAAA;AAC3B,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,GAAA;AAE3B,MAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,KAAK,cAAA,EAAe;AAC/C,MAAA,MAAM,aAAa,IAAA,CAAK,oBAAA,IAAwB,IAAA,CAAK,mBAAA,CAAoB,KAAK,QAAQ,CAAA;AAEtF,MAAA,MAAM,cAAc,IAAA,CAAK,YAAA,CAAa,gBAAgB,CAAA,EAAG,IAAA,CAAK,UAAU,MAAM,CAAA;AAC9E,MAAA,MAAM,QAAQ,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,CAAA,EAAG,YAAY,MAAM,CAAA;AAClE,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AAGvC,MAAA,MAAM,UAAA,GAAa,mBAAA,CAAoB,CAAA,EAAG,CAAA,EAAG,KAAK,iBAAiB,CAAA;AACnE,MAAA,IAAI,UAAA,EAAY;AACZ,QAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACjD,UAAA,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAO,UAAA,CAAW,SAAS,CAAA;AAAA,QACrD,CAAA,MAAO;AACH,UAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,UAAA,CAAW,SAAS,CAAA;AAAA,QAClD;AACA,QAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,QAAA;AAAA,MACJ;AAGA,MAAA,MAAM,QAAA,GAAW,2BAAA,CAA4B,CAAA,EAAG,CAAA,EAAG,KAAK,mBAAmB,CAAA;AAC3E,MAAA,IAAI,QAAA,EAAU;AACV,QAAA,IAAA,CAAK,mBAAA,CAAoB,SAAS,WAAW,CAAA;AAC7C,QAAA;AAAA,MACJ;AAGA,MAAA,MAAM,UAAA,GAAa,wBAAA,CAAyB,CAAA,EAAG,CAAA,EAAG,KAAK,sBAAsB,CAAA;AAC7E,MAAA,IAAI,UAAA,EAAY;AACZ,QAAA,IAAI,WAAW,MAAA,KAAW,SAAA,EAAW,IAAA,CAAK,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAAA,aACzE,IAAA,CAAK,oBAAA,CAAqB,UAAA,CAAW,KAAK,CAAA;AAC/C,QAAA;AAAA,MACJ;AAGA,MAAA,IAAI,IAAA,CAAK,kBAAA,IAAsB,IAAA,CAAK,iBAAA,EAAmB;AACnD,QAAA,MAAM,IAAI,IAAA,CAAK,iBAAA;AACf,QAAA,IAAI,CAAA,IAAK,CAAA,CAAE,KAAA,IAAS,CAAA,IAAK,EAAE,KAAA,GAAQ,CAAA,CAAE,KAAA,IAAS,CAAA,IAAK,EAAE,KAAA,IAAS,CAAA,IAAK,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAA,EAAO;AAClF,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,UAAA,IAAA,CAAK,mBAAmB,CAAC,CAAA;AACzB,UAAA;AAAA,QACJ;AAAA,MACJ;AAGA,MAAA,MAAM,WAAA,GAAc,sBAAA,CAAuB,CAAA,EAAG,CAAA,EAAG,KAAK,kBAAkB,CAAA;AACxE,MAAA,IAAI,WAAA,EAAa;AACb,QAAA,IAAA,CAAK,uBAAuB,WAAW,CAAA;AACvC,QAAA;AAAA,MACJ;AAOA,MAAA,IAAI,CAAC,IAAA,CAAK,cAAA,CAAe,aAAA,EAAc,EAAG;AACtC,QAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,CAAA,EAAG,CAAA,EAAG,KAAK,mBAAmB,CAAA;AACpE,QAAA,IAAI,OAAA,EAAS;AACT,UAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,OAAA,CAAQ,KAAK,CAAA;AAC/D,UAAA,IAAI,KAAA,EAAO,IAAA,CAAK,uBAAA,CAAwB,KAAK,CAAA;AAC7C,UAAA;AAAA,QACJ;AAAA,MACJ;AAGA,MAAA,IAAI,KAAK,gBAAA,IAAoB,CAAC,IAAA,CAAK,cAAA,CAAe,eAAc,EAAG;AAC/D,QAAA,MAAM,MAAA,GAAS,2BAAA,CAA4B,CAAA,EAAG,CAAA,EAAG,KAAK,oBAAoB,CAAA;AAC1E,QAAA,IAAI,MAAA,EAAQ;AACR,UAAA,IAAA,CAAK,uBAAA,CAAwB,QAAQ,CAAC,CAAA;AACtC,UAAA,IAAA,CAAK,UAAA,CAAW,MAAM,MAAA,GAAS,WAAA;AAC/B,UAAA;AAAA,QACJ;AAAA,MACJ;AAOA,MAAA,IAAI,KAAK,gBAAA,IAAoB,CAAC,IAAA,CAAK,cAAA,CAAe,eAAc,EAAG;AAC/D,QAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,CAAA,EAAG,CAAA,EAAG,KAAK,mBAAmB,CAAA;AACpE,QAAA,IAAI,OAAA,EAAS;AACT,UAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,OAAA,CAAQ,KAAK,CAAA;AAC/D,UAAA,IAAI,KAAA,EAAO;AAEP,YAAA,IAAI,EAAE,IAAA,CAAK,sBAAA,IAA0B,CAAC,QAAQ,SAAA,CAAA,EAAY;AACtD,cAAA,IAAA,CAAK,iBAAA,GAAoB,EAAE,OAAA,EAAS,KAAA,EAAO,MAAM,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AACzE,cAAA;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAOA,MAAA,MAAM,QAAA,GAAW,sBAAA,CAAuB,CAAA,EAAG,CAAA,EAAG,KAAK,eAAe,CAAA;AAClE,MAAA,IAAI,QAAA,EAAU;AACV,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,SAAS,KAAK,CAAA;AAE5D,QAAA,IAAI,IAAA,CAAK,kBAAA,KAAuB,QAAA,CAAS,KAAA,IAAS,CAAC,UAAA,EAAY;AAC3D,UAAA,IAAA,CAAK,sBAAA,CAAuB,SAAS,KAAK,CAAA;AAC1C,UAAA;AAAA,QACJ;AACA,QAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,QAAA,CAAS,KAAK,CAAA;AAChE,QAAA,IAAI,KAAA,EAAO;AACP,UAAA,IAAA,CAAK,wBAAwB,KAAK,CAAA;AAAA,QACtC,CAAA,MAAO;AACH,UAAA,IAAA,CAAK,qBAAqB,QAAA,CAAS,KAAA;AACnC,UAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,QAC1B;AACA,QAAA;AAAA,MACJ,CAAA,MAAA,IAAW,IAAA,CAAK,kBAAA,KAAuB,IAAA,EAAM;AAMzC,QAAA,IAAI,CAAC,IAAA,CAAK,sBAAA,IAA0B,IAAA,CAAK,4BAAA,EAA8B;AACnE,UAAA,MAAM,MAAM,IAAA,CAAK,kBAAA;AACjB,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,GAAG,CAAA;AAC9C,UAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAGlC,YAAA,IAAA,CAAK,uBAAuB,GAAG,CAAA;AAAA,UACnC,CAAA,MAAO;AAMH,YAAA,IAAA,CAAK,qBAAqB,GAAG,CAAA;AAAA,UACjC;AAAA,QACJ;AAAA,MACJ;AAGA,MAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,IAAA,GAAO,CAAA,EAAG;AAChC,QAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAC5B,QAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,MAC1B;AAGA,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,cAAA;AACrC,MAAA,IAAI,KAAK,MAAA,EAAQ;AACb,QAAA,IAAI,KAAK,MAAA,EAAQ;AAEb,UAAA,IAAA,CAAK,QAAA,GAAW,EAAE,IAAA,EAAM,OAAA,EAAS,UAAU,CAAA,EAAG,SAAA,EAAW,KAAK,gBAAA,EAAiB;AAAA,QACnF,CAAA,MAAO;AAEH,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CACjB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,CAAU,IAAA,KAAS,KAAK,CAAA,CACxC,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AAC3B,UAAA,IAAI,UAAU,MAAA,GAAS,cAAA;AACvB,UAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AACxB,YAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACzB,YAAA,IAAI,CAAA,IAAK,OAAA,IAAW,CAAA,GAAI,OAAA,GAAU,EAAA,EAAI;AAClC,cAAA,IAAA,CAAK,QAAA,GAAW;AAAA,gBACZ,IAAA,EAAM,SAAA;AAAA,gBACN,QAAA,EAAU,CAAA;AAAA,gBACV,WAAW,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,IAAK,CAAA;AAAA,gBACrD,eAAe,GAAA,CAAI;AAAA,eACvB;AACA,cAAA;AAAA,YACJ;AACA,YAAA,OAAA,IAAW,EAAA,GAAK,cAAA;AAAA,UACpB;AAAA,QACJ;AACA,QAAA,IAAA,CAAK,cAAA,EAAe;AACpB,QAAA;AAAA,MACJ;AACA,MAAA,IAAI,KAAK,SAAA,EAAW;AAEhB,QAAA,IAAA,CAAK,QAAA,GAAW;AAAA,UACZ,IAAA,EAAM,MAAA;AAAA,UACN,QAAA,EAAU,CAAA;AAAA,UACV,SAAA,EAAW,IAAA,CAAK,QAAA,CAAS,QAAA,GAAW,KAAK,QAAA,CAAS;AAAA,SACtD;AACA,QAAA,IAAA,CAAK,cAAA,EAAe;AACpB,QAAA;AAAA,MACJ;AAGA,MAAA,MAAM,IAAA,GAAO,KAAK,qBAAA,EAAsB;AACxC,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,IAAK,CAAC,CAAA;AACvD,MAAA,IAAI,OAAA,EAAS;AACT,QAAA,MAAM,GAAA,GAAM,KAAK,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,OAAA,CAAQ,aAAa,CAAA;AACxE,QAAA,MAAM,QAAA,GACF,KAAK,mBAAA,CAAoB,GAAA,CAAI,QAAQ,aAAa,CAAA,IAClD,KAAK,UAAA,IACL,eAAA;AACJ,QAAA,IAAA,CAAK,aAAA,GAAgB;AAAA,UACjB,eAAe,OAAA,CAAQ,aAAA;AAAA,UACvB,MAAA,EAAQ,CAAA;AAAA,UACR,MAAA,EAAQ;AAAA,SACZ;AACA,QAAA,IAAA,CAAK,cAAA,EAAe;AACpB,QAAA;AAAA,MACJ;AAGA,MAAA,MAAM,QAAA,GAAW,KAAK,cAAA,CAAe,WAAA;AAAA,QACjC,IAAA,CAAK,gBAAA,CAAiB,WAAA,EAAa,KAAK;AAAA,OAC5C;AAEA,MAAA,IAAI,CAAC,QAAA,EAAU;AAKX,QAAA,MAAM,SAAA,GAAY,KAAK,cAAA,CAAe,gBAAA;AAAA,UAClC,CAAA;AAAA,UACA,CAAA;AAAA,UACA,IAAA,CAAK,YAAA;AAAA,UACL,IAAA,CAAK,QAAA;AAAA,UACL,UAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACJ;AACA,QAAA,IAAI,SAAA,EAAW;AACX,UAAA,IAAA,CAAK,cAAA,CAAe,aAAA,CAAc,SAAA,CAAU,OAAO,CAAA;AACnD,UAAA,IAAA,CAAK,kBAAA,GAAqB;AAAA,YACtB,SAAS,SAAA,CAAU,OAAA;AAAA,YACnB,UAAA,EAAY,UAAU,MAAA,CAAO,UAAA;AAAA,YAC7B,MAAA,EAAQ,CAAA;AAAA,YACR,MAAA,EAAQ;AAAA,WACZ;AAAA,QACJ,CAAA,MAAO;AACH,UAAA,MAAM,OAAA,GAAU,KAAK,cAAA,CAAe,OAAA;AAAA,YAChC,CAAA;AAAA,YACA,CAAA;AAAA,YACA,IAAA,CAAK,YAAA;AAAA,YACL,IAAA,CAAK,QAAA;AAAA,YACL,UAAA;AAAA,YACA,MAAA;AAAA,YACA;AAAA,WACJ;AACA,UAAA,IAAA,CAAK,cAAA,CAAe,cAAc,OAAO,CAAA;AACzC,UAAA,IAAI,OAAA,EAAS;AACT,YAAA,IAAA,CAAK,mBAAmB,EAAE,OAAA,EAAS,SAAS,MAAA,EAAQ,CAAA,EAAG,QAAQ,CAAA,EAAE;AAAA,UACrE;AAAA,QACJ;AAEA,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA,IAAK,IAAA;AAC5C,QAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,OAAA,EAAS,EAAE,GAAG,CAAA,EAAG,QAAA,EAAU,KAAA,EAAO,GAAA,EAAK,CAAA;AAAA,MAC7D;AAEA,MAAA,IAAA,CAAK,cAAA,EAAe;AAAA,IACxB,CAAA;AAEA,IAAA,IAAA,CAAQ,aAAA,GAAgB,CAAC,CAAA,KAAwB;AAC7C,MAAA,IAAA,CAAK,eAAe,eAAA,EAAgB;AAEpC,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,WAAW,qBAAA,EAAsB;AAC3E,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,IAAA;AAC3B,MAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,GAAA;AAC3B,MAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,KAAK,cAAA,EAAe;AAC/C,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,cAAA;AAErC,MAAA,IAAI,KAAK,MAAA,EAAQ;AAEb,QAAA,IAAA,CAAK,cAAA,EAAe;AACpB,QAAA;AAAA,MACJ;AACA,MAAA,IAAI,KAAK,SAAA,EAAW;AAEhB,QAAA,IAAA,CAAK,aAAA,EAAc;AACnB,QAAA;AAAA,MACJ;AAGA,MAAA,MAAM,6BAAa,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,SAAA,EAAW,cAAc,CAAC,CAAA;AAC9D,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,kBAAA,EAAmB;AACxD,MAAA,IAAI,QAAA,IAAY,UAAA,CAAW,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,EAAG;AAC3C,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,mBAAA,CAAoB,IAAA,CAAK,QAAQ,CAAA;AACzD,QAAA,IACI,QAAA,CAAS,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,YAAA,EAAc,IAAA,CAAK,QAAA,EAAU,UAAA,EAAY,MAAA,EAAQ,MAAM,CAAA,EACrF;AACE,UAAA,IAAA,CAAK,cAAc,QAAQ,CAAA;AAC3B,UAAA;AAAA,QACJ;AAAA,MACJ;AAEA,MAAA,IAAA,CAAK,cAAA,EAAe;AAAA,IACxB,CAAA;AAEA,IAAA,IAAA,CAAQ,SAAA,GAAY,CAAC,CAAA,KAA2B;AAE5C,MAAA,IAAI,EAAE,GAAA,KAAQ,QAAA,IAAY,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAA,EAAG;AACtD,QAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAC5B,QAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA;AAAA,MACJ;AACA,MAAA,IAAI,EAAE,GAAA,KAAQ,QAAA,IAAY,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAA,EAAG;AACvD,QAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA;AAAA,MACJ;AACA,MAAA,MAAM,SAAS,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,KAAY,EAAE,GAAA,KAAQ,GAAA;AACpD,MAAA,MAAM,GAAA,GAAM,KAAA,GAAQ,GAAA,GAAM,CAAA,CAAE,GAAA;AAC5B,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,SAAA,CAAU,GAAG,CAAA;AAClD,MAAA,IAAI,QAAA,EAAU;AACV,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAA,CAAK,uBAAA,EAAwB;AAE7B,QAAA,IAAA,CAAK,OAAA,EAAS,aAAA,CAAc,IAAA,CAAK,cAAA,CAAe,eAAe,CAAA;AAC/D,QAAA,IAAA,CAAK,WAAW,KAAA,CAAM,MAAA,GAAS,KAAK,cAAA,CAAe,aAAA,KAC7C,WAAA,GACA,SAAA;AACN,QAAA,IAAA,CAAK,cAAA,EAAe;AAAA,MACxB;AAAA,IACJ,CAAA;AAuFA,IAAA,IAAA,CAAQ,MAAA,GAAS,CAAC,IAAA,KAAqB;AACnC,MAAA,IAAI,KAAK,YAAA,EAAc;AACvB,MAAA,MAAM,GAAA,GAAM,KAAK,SAAA,CAAU,GAAA;AAC3B,MAAA,IAAI,GAAA,CAAI,WAAW,CAAA,EAAG;AAGtB,MAAA,IAAI,KAAK,cAAA,EAAgB;AAEzB,MAAA,IAAA,CAAK,aAAa,EAAE,GAAA,EAAK,KAAK,GAAA,EAAK,GAAA,EAAK,KAAK,GAAA,EAAI;AACjD,MAAA,IAAA,CAAK,gBAAA,EAAiB;AAEtB,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AAC/B,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,SAAS,CAAA;AAEpD,MAAA,MAAM,YAAY,IAAA,CAAK,oBAAA,KAAyB,KAAA,GAAQ,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA;AAExE,MAAA,IAAI,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,IAAA,GAAO,UAAA,EAAY;AAEpC,QAAA,MAAM,OAAA,GAAoB;AAAA,UACtB,GAAG,IAAA;AAAA,UACH,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,MAAM,SAAS,CAAA;AAAA,UACnC,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAK,SAAS,CAAA;AAAA,UACjC,KAAA,EAAO,SAAA;AAAA,UACP,MAAA,EAAA,CAAS,IAAA,CAAK,MAAA,IAAU,CAAA,IAAK,IAAA,CAAK;AAAA,SACtC;AACA,QAAA,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAI,OAAA;AAAA,MAC1B,CAAA,MAAO;AAEH,QAAA,MAAM,YAAA,GAAe,IAAA;AAGrB,QAAA,MAAM,aAAa,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAA,GAAO,UAAU,CAAA,GAAI,UAAA;AACxD,QAAA,GAAA,CAAI,IAAA,CAAK;AAAA,UACL,IAAA,EAAM,UAAA;AAAA,UACN,IAAA,EAAM,SAAA;AAAA,UACN,IAAA,EAAM,SAAA;AAAA,UACN,GAAA,EAAK,SAAA;AAAA,UACL,KAAA,EAAO,SAAA;AAAA,UACP,QAAQ,IAAA,CAAK;AAAA,SAChB,CAAA;AACD,QAAA,IAAI,KAAK,MAAA,EAAQ;AAEb,UAAA,OAAA,CAAQ,IAAA;AAAA,YACJ,8BAAyB,IAAI,IAAA,CAAK,UAAU,CAAA,CAAE,aAAa,CAAA,SAAA,EAC3C,IAAI,IAAA,CAAK,aAAa,IAAI,CAAA,CAAE,aAAa,CAAA,eAAA,EACpC,IAAI,MAAM,CAAA;AAAA,WACnC;AAAA,QACJ;AACA,QAAA,MAAM,UAAA,GAAa,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AAErC,QAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,QAAA,IAAY,GAAA,CAAI,MAAA,EAAQ;AAC7C,UAAA,IAAA,CAAK,eAAA,GAAkB;AAAA,YACnB,GAAG,IAAA,CAAK,eAAA;AAAA,YACR,UAAA,EAAY,IAAA,CAAK,eAAA,CAAgB,UAAA,GAAa,CAAA;AAAA,YAC9C,QAAA,EAAU,IAAA,CAAK,eAAA,CAAgB,QAAA,GAAW;AAAA,WAC9C;AAAA,QACJ;AACA,QAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,QAAA,EAAU,EAAE,YAAA,EAAc,UAAA,EAAY,YAAY,CAAA;AAEpE,QAAA,IAAA,CAAK,mBAAA,CAAoB,YAAA,CAAa,IAAA,EAAM,UAAU,CAAA;AAKtD,QAAA,IAAI,UAAA,GAAa,YAAA,CAAa,IAAA,GAAO,UAAA,EAAY;AAC7C,UAAA,IAAA,CAAK,WAAA,CAAY,YAAA,CAAa,IAAA,EAAM,UAAU,CAAA;AAAA,QAClD;AAAA,MACJ;AAEA,MAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,MAAA,IAAA,CAAK,cAAA,EAAe;AAAA,IACxB,CAAA;AAjyMI,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,aAAa,WAAA,EAAa;AAClE,MAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,IACrE;AAEA,IAAA,yBAAA,EAA0B;AAQ1B,IAAA,IAAI,OAAO,cAAA,EAAgB;AACvB,MAAA,MAAM,KAAK,MAAA,CAAO,cAAA;AAClB,MAAA,MAAM,aAAa,MAAY;AAC3B,QAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,QAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,MAC3B,CAAA;AACA,MAAA,EAAA,CAAG,gBAAA,CAAiB,UAAU,UAAU,CAAA;AACxC,MAAA,EAAA,CAAG,gBAAA,CAAiB,UAAU,UAAU,CAAA;AACxC,MAAA,IAAA,CAAK,oBAAoB,MAAM;AAC3B,QAAA,EAAA,CAAG,mBAAA,CAAoB,UAAU,UAAU,CAAA;AAC3C,QAAA,EAAA,CAAG,mBAAA,CAAoB,UAAU,UAAU,CAAA;AAAA,MAC/C,CAAA;AAAA,IACJ;AAEA,IAAA,MAAM;AAAA,MACF,SAAA;AAAA,MACA,KAAA,GAAQ,MAAA;AAAA,MACR,MAAA,GAAS,aAAA;AAAA,MACT,UAAA,GAAa,IAAA;AAAA,MACb,MAAA,GAAS,IAAA;AAAA,MACT,SAAA,GAAY,IAAA;AAAA,MACZ,QAAA,GAAW,MAAA;AAAA,MACX,MAAA,GAAS,EAAA;AAAA,MACT,KAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA,UAAA;AAAA,MACA,oBAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA;AAAA,MACA,cAAA,GAAiB,GAAA;AAAA,MACjB,iBAAA,GAAoB,KAAA;AAAA,MACpB,SAAA,GAAY,KAAA;AAAA,MACZ,aAAA,GAAgB;AAAA,KACpB,GAAI,MAAA;AAEJ,IAAA,IAAA,CAAK,aAAa,UAAA,IAAc,IAAA;AAChC,IAAA,IAAA,CAAK,mBAAA,GAAsB,OAAO,gBAAA,KAAqB,KAAA;AACvD,IAAA,IAAA,CAAK,eAAA,GAAkB,OAAO,YAAA,KAAiB,KAAA;AAC/C,IAAA,IAAA,CAAK,iBAAA,GAAoB,OAAO,oBAAA,KAAyB,KAAA;AACzD,IAAA,IAAA,CAAK,QAAA,GAAW,gBAAgB,QAAQ,CAAA;AACxC,IAAA,IAAA,CAAK,MAAA,GAAS,cAAc,MAAM,CAAA;AAClC,IAAA,IAAA,CAAK,cAAA,GAAiB,cAAA;AACtB,IAAA,IAAA,CAAK,UAAA,GAAa,OAAO,UAAA,IAAc,GAAA;AACvC,IAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,kBAAkB,EAAE,CAAA;AAC7D,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,iBAAiB,GAAA,GAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA;AAClF,IAAA,IAAA,CAAK,iBAAA,GAAoB,OAAO,iBAAA,IAAqB,EAAA;AACrD,IAAA,IAAA,CAAK,kBAAA,GAAqB,OAAO,kBAAA,IAAsB,oBAAA;AACvD,IAAA,IAAA,CAAK,2BAA2B,MAAA,CAAO,wBAAA;AACvC,IAAA,IAAA,CAAK,qBAAA,GAAwB,OAAO,gBAAA,KAAqB,MAAA;AACzD,IAAA,IAAA,CAAK,gBAAA,GAAmB,OAAO,gBAAA,IAAoB,CAAA;AACnD,IAAA,IAAA,CAAK,gBAAA,GACD,MAAA,CAAO,kBAAA,IAAsB,IAAA,IAAQ,OAAO,wBAAA,IAA4B,IAAA;AAC5E,IAAA,IAAA,CAAK,iBAAA,GAAoB,OAAO,iBAAA,IAAqB,yBAAA;AACrD,IAAA,IAAA,CAAK,QAAA,GAAW;AAAA,MACZ,GAAG,IAAA,CAAK,QAAA;AAAA,MACR,QAAA,EAAU,kBAAA;AAAA,QACN,IAAA,CAAK,gBAAA;AAAA,QACL,IAAA,CAAK,qBAAA;AAAA,QACL,IAAA,CAAK,kBAAA;AAAA,QACL,IAAA,CAAK;AAAA;AACT,KACJ;AACA,IAAA,IAAA,CAAK,eAAA,GAAkB,EAAE,GAAG,IAAA,CAAK,QAAA,EAAS;AAC1C,IAAA,IAAA,CAAK,WAAA,GAAc,OAAO,WAAA,IAAe,CAAA;AACzC,IAAA,IAAA,CAAK,oBAAA,GAAuB,OAAO,oBAAA,IAAwB,KAAA;AAC3D,IAAA,IAAA,CAAK,gCAAA,GAAmC,OAAO,gCAAA,IAAoC,CAAA;AAEnF,IAAA,IAAI,MAAA,CAAO,mBAAA,KAAwB,MAAA,IAAU,MAAA,CAAO,wBAAwB,KAAA,EAAO;AAC/E,MAAA,IAAA,CAAK,8BAA8B,MAAA,CAAO,mBAAA;AAAA,IAC9C,CAAA,MAAO;AACH,MAAA,MAAM,eAAe,YAAA,CAAa,OAAA;AAAA,QAC9B,IAAA,CAAK;AAAA,OACT;AACA,MAAA,IAAI,YAAA,KAAiB,MAAA,IAAU,YAAA,KAAiB,KAAA,EAAO;AACnD,QAAA,IAAA,CAAK,2BAAA,GAA8B,YAAA;AAAA,MACvC;AAAA,IACJ;AACA,IAAA,IAAI,OAAO,kBAAA,EAAoB;AAC3B,MAAA,IAAA,CAAK,qBAAqB,MAAA,CAAO,kBAAA;AAAA,IACrC;AACA,IAAA,IAAI,OAAO,YAAA,EAAc;AACrB,MAAA,IAAA,CAAK,uBAAuB,MAAA,CAAO,YAAA;AAAA,IACvC;AACA,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,IAAA,IAAA,CAAK,eAAA,GAAkB,OAAO,eAAA,IAAmB,KAAA;AACjD,IAAA,IAAA,CAAK,WAAA,GAAc,OAAO,WAAA,IAAe,KAAA;AACzC,IAAA,IAAA,CAAK,sBAAA,GAAyB,OAAO,sBAAA,IAA0B,KAAA;AAC/D,IAAA,IAAA,CAAK,4BAAA,GAA+B,OAAO,4BAAA,IAAgC,KAAA;AAC3E,IAAA,IAAA,CAAK,qBAAA,GAAwB,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,OAAO,qBAAA,IAAyB,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAA;AACvF,IAAA,IAAA,CAAK,sBAAA,GAAyB,OAAO,sBAAA,IAA0B,IAAA;AAC/D,IAAA,IAAA,CAAK,wBAAA,GAA2B,OAAO,wBAAA,IAA4B,EAAA;AACnE,IAAA,IAAA,CAAK,iBAAA,GAAoB,OAAO,iBAAA,IAAqB,KAAA;AACrD,IAAA,IAAA,CAAK,UAAA,GAAa,OAAO,UAAA,KAAe,KAAA;AACxC,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,UAAA;AACtB,IAAA,IAAA,CAAK,mBAAA,GAAsB,OAAO,mBAAA,IAAuB,IAAA;AACzD,IAAA,IAAA,CAAK,4BAA4B,MAAA,CAAO,yBAAA;AACxC,IAAA,IAAA,CAAK,qBAAA,GAAwB,OAAO,qBAAA,IAAyB,KAAA;AAC7D,IAAA,IAAA,CAAK,sBAAA,GAAyB,OAAO,sBAAA,IAA0B,KAAA;AAC/D,IAAA,IAAI;AACA,MAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,uBAAuB,CAAA;AACvE,MAAA,IAAI,aAAA,KAAkB,IAAA,EAAM,IAAA,CAAK,qBAAA,GAAwB,aAAA,KAAkB,MAAA;AAC3E,MAAA,MAAM,kBAAA,GAAqB,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,2BAA2B,CAAA;AAChF,MAAA,IAAI,kBAAA,KAAuB,IAAA,EAAM,IAAA,CAAK,sBAAA,GAAyB,kBAAA,KAAuB,MAAA;AAAA,IAC1F,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,IAAA,CAAK,cAAA,GAAiB,aAAA;AACtB,IAAA,IAAI,MAAA,CAAO,YAAY,MAAA,EAAW;AAE9B,MAAA,OAAA,CAAQ,KAAK,oJAAoJ,CAAA;AACjK,MAAA,IAAA,CAAK,WAAW,MAAA,CAAO,OAAA;AAAA,IAC3B;AACA,IAAA,IAAI,MAAA,CAAO,iBAAA,KAAsB,MAAA,EAAW,IAAA,CAAK,qBAAqB,MAAA,CAAO,iBAAA;AAC7E,IAAA,IAAI,OAAO,mBAAA,EAAqB;AAC5B,MAAA,IAAI,OAAO,mBAAA,CAAoB,OAAA,KAAY,QAAW,IAAA,CAAK,YAAA,GAAe,OAAO,mBAAA,CAAoB,OAAA;AACrG,MAAA,IAAI,OAAO,mBAAA,CAAoB,OAAA,KAAY,QAAW,IAAA,CAAK,YAAA,GAAe,OAAO,mBAAA,CAAoB,OAAA;AAAA,IACzG;AACA,IAAA,IAAI,MAAA,CAAO,iBAAiB,MAAA,EAAW;AAEnC,MAAA,OAAA,CAAQ,KAAK,gIAAgI,CAAA;AAAA,IACjJ;AACA,IAAA,IAAI,MAAA,CAAO,kBAAkB,MAAA,EAAW;AAEpC,MAAA,OAAA,CAAQ,KAAK,iHAAiH,CAAA;AAAA,IAClI;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA,KAAU,MAAA,GAAS,MAAA,GAAS,OAAA;AAC7C,IAAA,IAAA,CAAK,iBAAiB,MAAA,CAAO,cAAA;AAC7B,IAAA,IAAA,CAAK,QAAA,GAAW,MAAA,CAAO,QAAA,KAAa,OAAA,GAC9B,IAAA,CAAK,cAAA,EAAe,CAAE,eAAA,EAAgB,CAAE,QAAA,GACvC,MAAA,CAAO,QAAA,IAAY,KAAA;AAC1B,IAAA,IAAA,CAAK,gBAAgB,MAAA,CAAO,aAAA;AAG5B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,KAAc,MAAA,GAAS,UAAA,GAAa,WAAA;AAC5D,IAAA,IAAA,CAAK,QAAQ,cAAA,CAAe,UAAA,EAAY,KAAK,cAAA,GAAiB,IAAA,CAAK,SAAS,CAAC,CAAA;AAC7E,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAId,IAAA,IAAA,CAAK,OAAA,GAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO;AAAA,MAC9B,OAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAe,QAAA;AAAA,MACf,KAAA,EAAO,MAAA;AAAA,MACP,MAAA,EAAQ,MAAA;AAAA,MACR,QAAA,EAAU,QAAA;AAAA,MACV,SAAA,EAAW;AAAA,KACd,CAAA;AAGD,IAAA,IAAI,MAAA,EAAQ;AACR,MAAA,MAAM,mBAAA,GAAsB,EAAE,GAAG,sBAAA,EAAwB,GAAG,oBAAA,EAAqB;AACjF,MAAA,IAAA,CAAK,SAAS,IAAI,MAAA;AAAA,QACd,CAAC,CAAA,KAAM,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA;AAAA,QACvB,CAAC,EAAA,KAAO;AACJ,UAAA,IAAA,CAAK,SAAA,GAAY,EAAA;AACjB,UAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,iBAAA,EAAmB,EAAE,SAAA,EAAW,IAAI,CAAA;AACtD,UAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,UAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,UAAA,IAAA,CAAK,YAAY,WAAW,CAAA;AAAA,QAChC,CAAA;AAAA,QACA,CAAC,IAAA,KAAS,IAAA,CAAK,kBAAA,CAAmB,IAAI,CAAA;AAAA,QACtC,CAAC,GAAG,EAAA,KAAO;AACP,UAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,UAAA,IAAA,CAAK,SAAA,GAAY,EAAA;AACjB,UAAA,IAAA,CAAK,MAAA,EAAQ,aAAa,EAAE,CAAA;AAC5B,UAAA,IAAA,CAAK,SAAA,EAAW,UAAU,CAAC,CAAA;AAC3B,UAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,gBAAA,EAAkB,EAAE,UAAU,CAAA,EAAG,SAAA,EAAW,IAAI,CAAA;AAClE,UAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,UAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,UAAA,IAAA,CAAK,YAAY,UAAU,CAAA;AAAA,QAC/B,CAAA;AAAA,QACA,MAAM;AACF,UAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,QAC3B,CAAA;AAAA,QACA,MAAM;AACF,UAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,QAC1B,CAAA;AAAA,QACA,IAAA,CAAK,mBAAA,GAAsB,MAAM,IAAA,CAAK,oBAAmB,GAAI,IAAA;AAAA,QAC7D,IAAA,CAAK,mBAAA;AAAA,QACL,IAAA,CAAK,eAAA;AAAA,QACL,IAAA,CAAK,iBAAA;AAAA,QACL,IAAA,CAAK,UAAA;AAAA,QACL,IAAA,CAAK,SAAA;AAAA,QACL,IAAA,CAAK,UAAA,GAAa,CAAC,OAAA,KAAqB;AAAE,UAAA,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,QAAG,CAAA,GAAI,IAAA;AAAA,QAC1E,IAAA,CAAK,MAAA;AAAA,QACL,IAAA,CAAK,SAAA;AAAA,QACL,IAAA;AAAA,QACA,mBAAA;AAAA,QACA,IAAA,CAAK,KAAA;AAAA,QACL,KAAK,QAAA,CAAS,MAAA;AAAA,QACd,KAAK,MAAA,CAAO,MAAA;AAAA,QACZ,MAAM,KAAK,WAAA;AAAY,OAC3B;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,mBAAA;AAAA,QACR,kBAAA,CAAkB,OAAO,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UACnD,OAAO,CAAA,CAAE,UAAA;AAAA,UACT,OAAO,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,EAAE,UAAU,CAAA,CAAA,CAAA;AAAA,UACjC,UAAU,CAAA,CAAE;AAAA,SAChB,CAAE;AAAA,OACN;AACA,MAAA,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,IAAA,CAAK,MAAA,CAAO,EAAE,CAAA;AAEvC,MAAA,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,IAAA,CAAK,YAAY,CAAA;AAAA,IAC/C;AAGA,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,IAAA,MAAA,CAAO,MAAA,CAAO,UAAU,KAAA,EAAO;AAAA,MAC3B,OAAA,EAAS,MAAA;AAAA,MACT,IAAA,EAAM,GAAA;AAAA,MACN,SAAA,EAAW,GAAA;AAAA,MACX,QAAA,EAAU,QAAA;AAAA,MACV,QAAA,EAAU;AAAA;AAAA,KACb,CAAA;AAED,IAAA,IAAI,MAAA,IAAU,KAAK,mBAAA,EAAqB;AACpC,MAAA,IAAA,CAAK,UAAU,IAAI,OAAA;AAAA,QACf,CAAC,IAAA,KAAS,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AAAA,QAClC,CAAC,QAAA,KAAa;AACV,UAAA,QAAQ,QAAA;AAAU,YACd,KAAK,MAAA;AACD,cAAA,IAAA,CAAK,WAAA,EAAY;AACjB,cAAA;AAAA,YACJ,KAAK,MAAA;AACD,cAAA,IAAA,CAAK,WAAA,EAAY;AACjB,cAAA;AAAA,YACJ,KAAK,iBAAA;AACD,cAAA,IAAA,CAAK,qBAAA,EAAsB;AAC3B,cAAA;AAAA,YACJ,KAAK,WAAA;AACD,cAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,cAAA;AAAA,YACJ,KAAK,UAAA;AACD,cAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,cAAA;AAAA,YACJ,KAAK,UAAA;AACD,cAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,cAAA;AAAA,YACJ,KAAK,UAAA;AACD,cAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,cAAA;AAAA,YACJ,KAAK,YAAA;AACD,cAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,cAAA;AAAA;AACR,QACJ,CAAA;AAAA,QACA,MAAM;AAEF,UAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AACtB,UAAA,IAAA,CAAK,MAAA,EAAQ,qBAAqB,KAAK,CAAA;AAAA,QAC3C,CAAA;AAAA,QACA,IAAA,CAAK,KAAA;AAAA,QACL,KAAK,QAAA,CAAS,cAAA;AAAA,QACd,KAAK,MAAA,CAAO;AAAA,OAChB;AACA,MAAA,SAAA,CAAU,WAAA,CAAY,IAAA,CAAK,OAAA,CAAQ,EAAE,CAAA;AAAA,IACzC;AAEA,IAAA,IAAA,CAAK,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO;AAAA,MACjC,IAAA,EAAM,GAAA;AAAA,MACN,QAAA,EAAU,UAAA;AAAA,MACV,QAAA,EAAU,QAAA;AAAA,MACV,WAAA,EAAa;AAAA,KAChB,CAAA;AAGD,IAAA,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC7C,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO;AAAA,MAC7B,QAAA,EAAU,UAAA;AAAA,MACV,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM,GAAA;AAAA,MACN,KAAA,EAAO,MAAA;AAAA,MACP,MAAA,EAAQ,MAAA;AAAA,MACR,aAAA,EAAe;AAAA,KAClB,CAAA;AACD,IAAA,IAAA,CAAK,UAAA,CAAW,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA;AAGvC,IAAA,IAAA,CAAK,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAClD,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO;AAAA,MAClC,QAAA,EAAU,UAAA;AAAA,MACV,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM,GAAA;AAAA,MACN,KAAA,EAAO,MAAA;AAAA,MACP,MAAA,EAAQ,MAAA;AAAA,MACR,aAAA,EAAe;AAAA,KAClB,CAAA;AACD,IAAA,IAAA,CAAK,UAAA,CAAW,WAAA,CAAY,IAAA,CAAK,WAAW,CAAA;AAG5C,IAAA,IAAA,CAAK,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACjD,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO;AAAA,MACjC,QAAA,EAAU,UAAA;AAAA,MACV,GAAA,EAAK,GAAA;AAAA,MACL,IAAA,EAAM,GAAA;AAAA,MACN,KAAA,EAAO,MAAA;AAAA,MACP,MAAA,EAAQ,MAAA;AAAA,MACR,MAAA,EAAQ,WAAA;AAAA,MACR,WAAA,EAAa,MAAA;AAAA,MACb,UAAA,EAAY;AAAA,KACf,CAAA;AAED,IAAC,IAAA,CAAK,UAAA,CAAW,KAAA,CAA4C,kBAAkB,CAAA,GAAI,MAAA;AACnF,IAAC,IAAA,CAAK,UAAA,CAAW,KAAA,CAA4C,oBAAoB,CAAA,GAAI,MAAA;AACrF,IAAA,IAAA,CAAK,UAAA,CAAW,WAAA,CAAY,IAAA,CAAK,UAAU,CAAA;AAG3C,IAAA,IAAA,CAAK,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AACjD,IAAA,IAAA,CAAK,YAAY,IAAA,GAAO,MAAA;AACxB,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO;AAAA,MAClC,QAAA,EAAU,UAAA;AAAA,MACV,OAAA,EAAS,MAAA;AAAA,MACT,MAAA,EAAQ,IAAA;AAAA,MACR,UAAA,EAAY,aAAA;AAAA,MACZ,MAAA,EAAQ,MAAA;AAAA,MACR,YAAA,EAAc,mBAAA;AAAA,MACd,KAAA,EAAO,SAAA;AAAA;AAAA;AAAA,MAGP,IAAA,EAAM,4BAAA;AAAA,MACN,OAAA,EAAS,MAAA;AAAA,MACT,QAAA,EAAU,MAAA;AAAA,MACV,OAAA,EAAS;AAAA,KACZ,CAAA;AACD,IAAA,IAAA,CAAK,UAAA,CAAW,WAAA,CAAY,IAAA,CAAK,WAAW,CAAA;AAI5C,IAAA,IAAI,MAAA,EAAQ;AACR,MAAA,IAAA,CAAK,gBAAA,GAAmB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACpD,MAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO;AAAA,QACvC,OAAA,EAAS,MAAA;AAAA,QACT,QAAA,EAAU,UAAA;AAAA,QACV,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,GAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,MAAA,EAAQ,MAAA;AAAA,QACR,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB,QAAA;AAAA,QAChB,aAAA,EAAe,MAAA;AAAA,QACf,MAAA,EAAQ;AAAA,OACX,CAAA;AACD,MAAA,MAAM,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAClD,MAAA,YAAA,CAAa,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,OAAA;AAC7C,MAAA,MAAA,CAAO,MAAA,CAAO,aAAa,KAAA,EAAO;AAAA,QAC9B,KAAA,EAAO,uBAAA;AAAA,QACP,QAAA,EAAU,MAAA;AAAA,QACV,UAAA,EAAY,kBAAA;AAAA,QACZ,OAAA,EAAS,UAAA;AAAA,QACT,YAAA,EAAc;AAAA,OACjB,CAAA;AACD,MAAA,IAAA,CAAK,gBAAA,CAAiB,YAAY,YAAY,CAAA;AAC9C,MAAA,IAAA,CAAK,UAAA,CAAW,WAAA,CAAY,IAAA,CAAK,gBAAgB,CAAA;AAEjD,MAAA,IAAA,CAAK,eAAA,GAAkB,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACnD,MAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,eAAA,CAAgB,KAAA,EAAO;AAAA,QACtC,OAAA,EAAS,MAAA;AAAA,QACT,QAAA,EAAU,UAAA;AAAA,QACV,GAAA,EAAK,GAAA;AAAA,QACL,IAAA,EAAM,GAAA;AAAA,QACN,KAAA,EAAO,MAAA;AAAA,QACP,MAAA,EAAQ,MAAA;AAAA,QACR,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB,QAAA;AAAA,QAChB,aAAA,EAAe,MAAA;AAAA,QACf,MAAA,EAAQ;AAAA,OACX,CAAA;AACD,MAAA,MAAM,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AACjD,MAAA,WAAA,CAAY,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,MAAA;AAC5C,MAAA,MAAA,CAAO,MAAA,CAAO,YAAY,KAAA,EAAO;AAAA,QAC7B,KAAA,EAAO,uBAAA;AAAA,QACP,QAAA,EAAU,MAAA;AAAA,QACV,UAAA,EAAY,kBAAA;AAAA,QACZ,OAAA,EAAS,UAAA;AAAA,QACT,YAAA,EAAc;AAAA,OACjB,CAAA;AACD,MAAA,IAAA,CAAK,eAAA,CAAgB,YAAY,WAAW,CAAA;AAC5C,MAAA,IAAA,CAAK,UAAA,CAAW,WAAA,CAAY,IAAA,CAAK,eAAe,CAAA;AAAA,IACpD;AAKA,IAAA,IAAI,MAAA,IAAU,EAAE,iBAAA,IAAqB,SAAA,CAAA,EAAY;AAC7C,MAAA,IAAA,CAAK,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AACxC,MAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO;AAAA,QAC3B,QAAA,EAAU,UAAA;AAAA,QACV,GAAA,EAAK,KAAA;AAAA,QACL,IAAA,EAAM,KAAA;AAAA,QACN,MAAA,EAAQ,IAAA;AAAA,QACR,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,GAAA,EAAK,KAAA;AAAA,QACL,aAAA,EAAe;AAAA,OAClB,CAAA;AAED,MAAA,IAAI,CAAC,iBAAA,EAAmB;AACpB,QAAA,IAAA,CAAK,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AACjD,QAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO;AAAA,UACnC,KAAA,EAAO,KAAK,KAAA,CAAM,QAAA;AAAA,UAClB,QAAA,EAAU,MAAA;AAAA,UACV,UAAA,EAAY,gCAAA;AAAA,UACZ,UAAA,EAAY,KAAA;AAAA,UACZ,OAAA,EAAS,SAAS,QAAA,GAAW;AAAA,SAChC,CAAA;AACD,QAAA,IAAA,CAAK,YAAA,CAAa,cAAc,MAAA,IAAU,EAAA;AAI1C,QAAA,IAAI,aAAA,EAAe;AACf,UAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO;AAAA,YACnC,MAAA,EAAQ,SAAA;AAAA,YACR,cAAA,EAAgB,WAAA;AAAA,YAChB,aAAA,EAAe;AAAA,WAClB,CAAA;AACD,UAAA,IAAA,CAAK,YAAA,CAAa,gBAAA,CAAiB,OAAA,EAAS,MAAM;AAC9C,YAAA,aAAA,CAAc,IAAA,CAAK,YAAA,EAAc,WAAA,IAAe,EAAE,CAAA;AAAA,UACtD,CAAC,CAAA;AAAA,QACL,WAAW,YAAA,EAAc;AACrB,UAAA,IAAI,KAAA,OAAY,KAAA,GAAQ,KAAA;AACxB,UAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,eAAA,CAAgB,IAAA,CAAK,OAAO,YAAA,EAAc,MAAM,IAAA,CAAK,WAAA,EAAa,CAAA;AAC7F,UAAA,IAAA,CAAK,eAAA,EAAgB,CAAE,WAAA,CAAY,IAAA,CAAK,gBAAgB,EAAE,CAAA;AAC1D,UAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO;AAAA,YACnC,MAAA,EAAQ,SAAA;AAAA,YACR,cAAA,EAAgB,WAAA;AAAA,YAChB,aAAA,EAAe;AAAA,WAClB,CAAA;AACD,UAAA,IAAA,CAAK,YAAA,CAAa,gBAAA,CAAiB,OAAA,EAAS,MAAM;AAC9C,YAAA,IAAA,CAAK,gBAAiB,IAAA,CAAK,IAAA,CAAK,OAAO,IAAA,CAAK,YAAA,CAAc,eAAe,EAAE,CAAA;AAAA,UAC/E,CAAC,CAAA;AAAA,QACL;AAEA,QAAA,IAAA,CAAK,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAChD,QAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO;AAAA,UAClC,KAAA,EAAO,KAAA;AAAA,UACP,MAAA,EAAQ,KAAA;AAAA,UACR,YAAA,EAAc,KAAA;AAAA,UACd,UAAA,EAAY,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,MAAA,CAAO,YAAA;AAAA,UACjC,OAAA,EAAS,cAAA;AAAA,UACT,UAAA,EAAY;AAAA,SACf,CAAA;AAAA,MACL;AAEA,MAAA,IAAI,CAAC,SAAA,EAAW;AACZ,QAAA,IAAA,CAAK,UAAA,GAAa,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC/C,QAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO;AAAA,UACjC,QAAA,EAAU,MAAA;AAAA,UACV,UAAA,EAAY,gCAAA;AAAA,UACZ,UAAA,EAAY;AAAA,SACf,CAAA;AAED,QAAA,IAAA,CAAK,WAAA,GAAc,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAChD,QAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO;AAAA,UAClC,QAAA,EAAU,MAAA;AAAA,UACV,UAAA,EAAY,gCAAA;AAAA,UACZ,UAAA,EAAY;AAAA,SACf,CAAA;AAAA,MACL;AAGA,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,MAAA,MAAA,CAAO,MAAA,CAAO,OAAO,KAAA,EAAO;AAAA,QACxB,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,GAAA,EAAK;AAAA,OACR,CAAA;AACD,MAAA,IAAI,IAAA,CAAK,WAAA,EAAa,MAAA,CAAO,MAAA,CAAO,KAAK,WAAW,CAAA;AACpD,MAAA,IAAI,IAAA,CAAK,YAAA,EAAc,MAAA,CAAO,MAAA,CAAO,KAAK,YAAY,CAAA;AACtD,MAAA,IAAI,IAAA,CAAK,UAAA,EAAY,MAAA,CAAO,MAAA,CAAO,KAAK,UAAU,CAAA;AAGlD,MAAA,IAAA,CAAK,IAAA,CAAK,OAAO,MAAM,CAAA;AACvB,MAAA,IAAI,KAAK,WAAA,EAAa,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,KAAK,WAAW,CAAA;AACvD,MAAA,IAAA,CAAK,UAAA,CAAW,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAAA,IACzC;AAGA,IAAA,IAAI,MAAA,EAAQ;AACR,MAAA,IAAA,CAAK,mBAAmB,IAAI,gBAAA;AAAA,QACxB,IAAA,CAAK,KAAA;AAAA,QACL,KAAK,QAAA,CAAS,gBAAA;AAAA,QACd,KAAK,MAAA,CAAO;AAAA,OAChB;AACA,MAAA,IAAA,CAAK,UAAA,CAAW,WAAA,CAAY,IAAA,CAAK,gBAAA,CAAiB,EAAE,CAAA;AAEpD,MAAA,IAAA,CAAK,0BAA0B,IAAI,uBAAA;AAAA,QAC/B,IAAA,CAAK,KAAA;AAAA,QACL,KAAK,MAAA,CAAO,OAAA;AAAA,QACZ,MAAM,KAAK,WAAA;AAAY,OAC3B;AACA,MAAA,IAAA,CAAK,eAAA,EAAgB,CAAE,WAAA,CAAY,IAAA,CAAK,wBAAwB,EAAE,CAAA;AAGlE,MAAA,IAAA,CAAK,cAAA,GAAiB,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACrD,MAAA,IAAA,CAAK,cAAA,CAAe,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,cAAA;AAC9C,MAAA,IAAA,CAAK,yBAAA,EAA0B;AAC/B,MAAA,IAAA,CAAK,eAAe,gBAAA,CAAiB,OAAA,EAAS,MAAM,IAAA,CAAK,aAAa,CAAA;AACtE,MAAA,IAAA,CAAK,UAAA,CAAW,WAAA,CAAY,IAAA,CAAK,cAAc,CAAA;AAG/C,MAAA,IAAA,CAAK,YAAA,GAAe,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACnD,MAAA,IAAA,CAAK,aAAa,KAAA,GAAQ,YAAA;AAC1B,MAAA,IAAA,CAAK,uBAAA,EAAwB;AAC7B,MAAA,IAAA,CAAK,aAAa,gBAAA,CAAiB,OAAA,EAAS,MAAM,IAAA,CAAK,WAAW,CAAA;AAClE,MAAA,IAAA,CAAK,UAAA,CAAW,WAAA,CAAY,IAAA,CAAK,YAAY,CAAA;AAAA,IACjD;AAGA,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAI,gBAAA,EAAiB;AAE7C,IAAA,IAAI,OAAO,cAAA,EAAgB;AACvB,MAAA,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,mBAAA,EAAqB,MAAA,CAAO,cAAc,CAAA;AAAA,IAC9D;AACA,IAAA,IAAI,OAAO,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,gBAAA,EAAkB,MAAA,CAAO,WAAW,CAAA;AAAA,IACxD;AAGA,IAAA,IAAI,aAAA,EAAe;AACf,MAAA,IAAA,CAAK,eAAe,IAAI,YAAA;AAAA,QACpB,IAAA,CAAK,KAAA;AAAA,QACL,IAAA;AAAA,QACA,IAAA,CAAK,MAAA;AAAA,QACL,CAAC,IAAA,EAAM,KAAA,EAAO,SAAA,KAAc;AACxB,UAAA,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAM,KAAA,EAAO,SAAS,CAAA;AAAA,QAChD,CAAA;AAAA,QACA,KAAK,MAAA,CAAO,KAAA;AAAA,QACZ,MAAM,KAAK,WAAA;AAAY,OAC3B;AACA,MAAA,IAAA,CAAK,UAAA,CAAW,WAAA,CAAY,IAAA,CAAK,YAAA,CAAa,EAAE,CAAA;AAEhD,MAAA,IAAA,CAAK,cAAc,IAAI,WAAA;AAAA,QACnB,IAAA,CAAK,KAAA;AAAA,QACL,IAAA,CAAK,cAAA;AAAA,QACL,MAAM;AACF,UAAA,IAAI,IAAA,CAAK,qBAAA,IAAyB,IAAA,CAAK,YAAA,EAAc;AACjD,YAAA,IAAA,CAAK,aAAa,IAAA,EAAK;AACvB,YAAA,MAAM,QAAA,GAAW,IAAA,CAAK,cAAA,GAAiB,EAAA,GAAK,EAAA,GAAK,CAAA;AACjD,YAAA,MAAM,EAAE,KAAA,EAAO,CAAA,EAAE,GAAI,IAAA,CAAK,qBAAA;AAC1B,YAAA,IAAA,CAAK,YAAA,CAAa,IAAA;AAAA,cACd,KAAA;AAAA,cACA,CAAA;AAAA,cACA,QAAA;AAAA,cACA,IAAA,CAAK,UAAU,iBAAA,EAAkB;AAAA,cACjC,IAAA,CAAK,kBAAA,CAAmB,KAAA,EAAQ,KAAK,CAAA;AAAA,cACrC,IAAA,CAAK,kBAAA,CAAmB,MAAA,EAAQ,KAAK;AAAA,aACzC;AAAA,UACJ;AAAA,QACJ,CAAA;AAAA,QACA,KAAK,MAAA,CAAO,KAAA;AAAA,QACZ,KAAK,QAAA,CAAS;AAAA,OAClB;AACA,MAAA,IAAA,CAAK,UAAA,CAAW,WAAA,CAAY,IAAA,CAAK,WAAA,CAAY,EAAE,CAAA;AAC/C,MAAA,IAAA,CAAK,WAAA,CAAY,EAAA,CAAG,gBAAA,CAAiB,YAAA,EAAc,MAAM;AACrD,QAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,QAAA,IAAA,CAAK,cAAA,EAAe;AAAA,MACxB,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,WAAA,CAAY,EAAA,CAAG,gBAAA,CAAiB,WAAA,EAAa,CAAC,CAAA,KAAM;AACrD,QAAA,IAAI,CAAA,CAAE,YAAY,CAAA,EAAG;AACrB,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,WAAW,qBAAA,EAAsB;AAC3E,QAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,GAAA;AAC3B,QAAA,MAAM,EAAE,MAAA,EAAO,GAAI,IAAA,CAAK,cAAA,EAAe;AAGvC,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,WAAA,CAAY,IAAA,GAAO,CAAA;AAClD,QAAA,IAAI,uBAAA,CAAwB,CAAA,EAAG,QAAA,EAAU,IAAA,CAAK,mBAAmB,CAAA,EAAG;AAChE,UAAA,IAAA,CAAK,aAAa,IAAA,EAAK;AACvB,UAAA;AAAA,QACJ;AAEA,QAAA,IAAI,CAAA,IAAK,CAAA,IAAK,CAAA,IAAK,MAAA,EAAQ;AACvB,UAAA,IAAA,CAAK,WAAA,EAAa,KAAK,CAAC,CAAA;AACxB,UAAA,MAAM,aACF,IAAA,CAAK,oBAAA,IAAwB,IAAA,CAAK,mBAAA,CAAoB,KAAK,QAAQ,CAAA;AACvE,UAAA,MAAM,QAAQ,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,CAAA,EAAG,YAAY,MAAM,CAAA;AAClE,UAAA,IAAA,CAAK,qBAAA,GAAwB,EAAE,KAAA,EAAO,CAAA,EAAE;AAAA,QAC5C;AAAA,MACJ,CAAC,CAAA;AAAA,IACL;AAEA,IAAA,SAAA,CAAU,WAAA,CAAY,KAAK,UAAU,CAAA;AACrC,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,SAAS,CAAA;AAGlC,IAAA,IAAI,UAAU,aAAA,EAAe;AACzB,MAAA,MAAM,mBAAA,GAAsB,EAAE,GAAG,sBAAA,EAAwB,GAAG,oBAAA,EAAqB;AACjF,MAAA,IAAA,CAAK,YAAY,IAAI,SAAA;AAAA,QACjB,CAAC,GAAG,EAAA,KAAO;AACP,UAAA,IAAA,CAAK,QAAA,GAAW,CAAA;AAChB,UAAA,IAAA,CAAK,SAAA,GAAY,EAAA;AACjB,UAAA,IAAA,CAAK,MAAA,EAAQ,aAAa,EAAE,CAAA;AAC5B,UAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,gBAAA,EAAkB,EAAE,UAAU,CAAA,EAAG,SAAA,EAAW,IAAI,CAAA;AAClE,UAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,UAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,UAAA,IAAA,CAAK,YAAY,UAAU,CAAA;AAAA,QAC/B,CAAA;AAAA,QACA,KAAK,QAAA,IAAY,IAAA;AAAA,QACjB,IAAA,CAAK,KAAA;AAAA,QACL,mBAAA;AAAA,QACA,KAAK,QAAA,CAAS,SAAA;AAAA,QACd,KAAK,MAAA,CAAO;AAAA,OAChB;AACA,MAAA,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,IAAA,CAAK,SAAA,CAAU,EAAE,CAAA;AAAA,IAC9C;AAEA,IAAA,SAAA,CAAU,WAAA,CAAY,KAAK,OAAO,CAAA;AAKlC,IAAA,IAAI,KAAK,cAAA,EAAgB;AACrB,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,SAAS,CAAA;AAC3C,MAAA,IAAA,CAAK,MAAA,EAAQ,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAChC,MAAA,IAAA,CAAK,SAAA,EAAW,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AACnC,MAAA,IAAA,CAAK,OAAA,EAAS,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AACjC,MAAA,IAAA,CAAK,WAAA,EAAa,QAAA,CAAS,IAAA,CAAK,KAAA,EAAO,KAAK,cAAc,CAAA;AAAA,IAC9D;AAIA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AACvC,IAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,+BAA+B,CAAA;AACzD,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AAEX,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA;AAC/C,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,MAAM,uCAAuC,CAAA;AACrE,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAEf,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,UAAA,CAAW,IAAI,CAAA;AACjD,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,qCAAqC,CAAA;AACpE,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAGhB,IAAA,IAAI,KAAK,WAAA,EAAa;AAClB,MAAA,MAAM,GAAA,GAAM,IAAI,KAAA,EAAM;AACtB,MAAA,GAAA,CAAI,SAAS,MAAM;AACf,QAAA,IAAA,CAAK,SAAA,GAAY,GAAA;AACjB,QAAA,IAAA,CAAK,cAAA,EAAe;AAAA,MACxB,CAAA;AACA,MAAA,GAAA,CAAI,GAAA,GAAM,WAAA;AAAA,IACd;AAGA,IAAA,IAAA,CAAK,cAAA,CAAe,cAAc,MAAM;AACpC,MAAA,IAAA,CAAK,OAAA,EAAS,cAAc,IAAI,CAAA;AAChC,MAAA,IAAA,CAAK,UAAA,CAAW,MAAM,MAAA,GAAS,SAAA;AAAA,IACnC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,cAAA,CAAe,gBAAA,GAAmB,MAAM,IAAA,CAAK,eAAA,EAAgB;AAKlE,IAAA,IAAA,CAAK,cAAA,CAAe,eAAA,GAAkB,CAAC,OAAA,KAAY;AAC/C,MAAA,KAAA,MAAW,EAAA,IAAM,QAAQ,MAAA,EAAQ;AAC7B,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,mBAAA,CAAoB,EAAA,CAAG,QAAQ,CAAA;AAC9C,QAAA,IAAI,CAAA,IAAK,IAAA,EAAM,EAAA,CAAG,SAAA,GAAY,CAAA;AAAA,MAClC;AAAA,IACJ,CAAA;AAGA,IAAA,IAAA,CAAK,eAAe,eAAA,GAAkB,CAAC,OAAA,KAAY,IAAA,CAAK,cAAc,OAAO,CAAA;AAI7E,IAAA,IAAA,CAAK,sBAAsB,IAAI,mBAAA;AAAA,MAC3B,IAAA,CAAK,UAAA;AAAA,MACL,IAAA,CAAK,KAAA;AAAA,MACL,CAAC,EAAA,EAAI,KAAA,KAAU,IAAA,CAAK,kBAAA,CAAmB,IAAI,KAAK;AAAA,KACpD;AACA,IAAA,IAAA,CAAK,cAAA,CAAe,iBAAA,GAAoB,CAAC,OAAA,KAAY;AACjD,MAAA,IAAI,OAAA,IAAW,OAAA,CAAQ,QAAA,IAAY,OAAA,CAAQ,WAAW,IAAA,EAAM;AACxD,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,sBAAA,CAAuB,OAAO,CAAA;AAClD,QAAA,IAAI,MAAA,OAAa,mBAAA,EAAqB,IAAA,CAAK,SAAS,MAAA,CAAO,CAAA,EAAG,OAAO,CAAC,CAAA;AAAA,aACjE,IAAA,CAAK,qBAAqB,IAAA,EAAK;AAAA,MACxC,CAAA,MAAO;AACH,QAAA,IAAA,CAAK,qBAAqB,IAAA,EAAK;AAAA,MACnC;AAAA,IACJ,CAAA;AAIA,IAAA,IAAA,CAAK,aAAa,IAAI,UAAA;AAAA,MAClB,IAAA,CAAK,UAAA;AAAA,MACL,MAAM,IAAA,CAAK,eAAA;AAAA,MACX,CAAC,CAAA,KAAM;AACH,QAAA,IAAA,CAAK,eAAA,GAAkB,CAAA;AACvB,QAAA,IAAA,CAAK,aAAA,EAAc;AACnB,QAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,QAAA,IAAA,CAAK,cAAA,EAAe;AACpB,QAAA,IAAA,CAAK,uBAAA,EAAwB;AAAA,MACjC,CAAA;AAAA,MACA,MAAM,KAAK,SAAA,CAAU,MAAA;AAAA,MACrB,MAAM,KAAK,cAAA,EAAe;AAAA,MAC1B,MACI,IAAA,CAAK,cAAA,CAAe,aAAA,EAAc,KAAM,QACxC,IAAA,CAAK,cAAA,CAAe,iBAAA,EAAkB,IACtC,IAAA,CAAK,cAAA,CAAe,mBAAkB,IACtC,IAAA,CAAK,aAAA,KAAkB,IAAA,IACvB,IAAA,CAAK,QAAA,KAAa,SACjB,IAAA,CAAK,gBAAA,EAAkB,MAAA,IAAU,KAAA,CAAA,IAClC,IAAA,CAAK,sBAAA;AAAA,MACT,CAAC,MAAA,KAAmB;AAChB,QAAA,IAAI,IAAA,CAAK,qBAAqB,CAAA,EAAK;AACnC,QAAA,MAAM,EAAE,MAAA,EAAO,GAAI,IAAA,CAAK,cAAA,EAAe;AACvC,QAAA,MAAM,eACF,IAAA,CAAK,oBAAA,IAAwB,IAAA,CAAK,mBAAA,CAAoB,KAAK,eAAe,CAAA;AAC9E,QAAA,MAAM,aAAA,GAAA,CAAiB,YAAA,CAAa,GAAA,GAAM,YAAA,CAAa,GAAA,IAAO,MAAA;AAC9D,QAAA,IAAA,CAAK,kBAAkB,MAAA,GAAS,aAAA;AAChC,QAAA,IAAA,CAAK,cAAA,EAAe;AACpB,QAAA,IAAA,CAAK,uBAAA,EAAwB;AAAA,MACjC,CAAA;AAAA,MACA,MAAM;AACF,QAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,MACtB,CAAA;AAAA,MACA,MAAM;AACF,QAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAAA,MACtB,CAAA;AAAA,MACA;AAAA,QACI,SAAa,MAAA,CAAO,qBAAA;AAAA,QACpB,OAAa,MAAA,CAAO,aAAA;AAAA,QACpB,WAAa,MAAA,CAAO,iBAAA;AAAA,QACpB,aAAa,MAAA,CAAO;AAAA;AACxB,KACJ;AAEA,IAAA,IAAA,CAAK,cAAc,IAAI,WAAA;AAAA,MACnB,IAAA,CAAK,UAAA;AAAA,MACL,MAAM,IAAA,CAAK,eAAA;AAAA,MACX,CAAC,CAAA,KAAM;AACH,QAAA,IAAA,CAAK,eAAA,GAAkB,CAAA;AACvB,QAAA,IAAA,CAAK,aAAA,EAAc;AACnB,QAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,QAAA,IAAA,CAAK,cAAA,EAAe;AACpB,QAAA,IAAA,CAAK,uBAAA,EAAwB;AAAA,MACjC,CAAA;AAAA,MACA,MAAM,KAAK,SAAA,CAAU,MAAA;AAAA,MACrB,MAAM,KAAK,cAAA,EAAe;AAAA,MAC1B,MAAM,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,WAAW,qBAAA,EAAsB;AAAA,MACpE,MAAM,IAAA,CAAK,cAAA,EAAe,CAAE,MAAA;AAAA,MAC5B,CAAC,EAAA,KAAe;AACZ,QAAA,MAAM,KAAK,IAAA,CAAK,eAAA;AAChB,QAAA,MAAM,WAAA,GAAc,EAAA,CAAG,QAAA,GAAW,EAAA,CAAG,UAAA;AACrC,QAAA,MAAM,YAAA,GAAe,WAAA,GAAc,IAAA,CAAK,UAAA,CAAW,KAAA;AACnD,QAAA,MAAM,QAAQ,EAAA,GAAK,YAAA;AACnB,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,WAAA,GAAc,CAAC,CAAC,CAAA;AAChF,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,QAAA,EAAU,EAAA,CAAG,UAAA,GAAa,KAAK,CAAC,CAAA;AACtE,QAAA,IAAA,CAAK,eAAA,GAAkB;AAAA,UACnB,GAAG,EAAA;AAAA,UACH,UAAA,EAAY,QAAA;AAAA,UACZ,UAAU,QAAA,GAAW;AAAA,SACzB;AACA,QAAA,IAAA,CAAK,aAAA,EAAc;AACnB,QAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,QAAA,IAAA,CAAK,cAAA,EAAe;AACpB,QAAA,IAAA,CAAK,uBAAA,EAAwB;AAAA,MACjC;AAAA,KACJ;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,gBAAA,CAAiB,WAAA,EAAa,IAAA,CAAK,WAAW,CAAA;AAC9D,IAAA,IAAA,CAAK,UAAA,CAAW,gBAAA,CAAiB,YAAA,EAAc,IAAA,CAAK,YAAY,CAAA;AAChE,IAAA,IAAA,CAAK,UAAA,CAAW,gBAAA,CAAiB,WAAA,EAAa,IAAA,CAAK,aAAa,CAAA;AAChE,IAAA,IAAA,CAAK,UAAA,CAAW,gBAAA,CAAiB,UAAA,EAAY,IAAA,CAAK,aAAa,CAAA;AAC/D,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAA,EAAW,IAAA,CAAK,SAAS,CAAA;AACjD,IAAA,IAAA,CAAK,UAAA,CAAW,gBAAA,CAAiB,YAAA,EAAc,IAAA,CAAK,mBAAA,EAAqB;AAAA,MACrE,OAAA,EAAS;AAAA,KACZ,CAAA;AACD,IAAA,IAAA,CAAK,UAAA,CAAW,iBAAiB,WAAA,EAAa,IAAA,CAAK,oBAAoB,EAAE,OAAA,EAAS,OAAO,CAAA;AACzF,IAAA,IAAA,CAAK,UAAA,CAAW,iBAAiB,UAAA,EAAY,IAAA,CAAK,mBAAmB,EAAE,OAAA,EAAS,OAAO,CAAA;AAEvF,IAAA,IAAA,CAAK,WAAW,gBAAA,CAAiB,aAAA,EAAe,CAAC,CAAA,KAAM,CAAA,CAAE,gBAAgB,CAAA;AAGzE,IAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,EAAW,IAAA,CAAK,SAAS,CAAA;AAInD,IAAA,MAAM,qBAAqB,MAAM;AAC7B,MAAA,MAAM,MAAA,GAAS,CAAC,CAAC,QAAA,CAAS,iBAAA;AAC1B,MAAA,IAAI,CAAC,MAAA,EAAQ,IAAA,CAAK,gBAAA,GAAmB,KAAA;AACrC,MAAA,IAAA,CAAK,MAAA,EAAQ,cAAc,MAAM,CAAA;AACjC,MAAA,IAAA,CAAK,wBAAA,EAAyB;AAAA,IAClC,CAAA;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,gBAAA,CAAiB,kBAAA,EAAoB,kBAAkB,CAAA;AACpE,IAAA,QAAA,CAAS,gBAAA,CAAiB,oBAAoB,kBAAkB,CAAA;AAIhE,IAAA,IAAA,CAAK,iBAAiB,IAAI,cAAA,CAAe,MAAM,IAAA,CAAK,UAAU,CAAA;AAC9D,IAAA,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA;AAC3C,IAAA,IAAA,CAAK,QAAA,EAAS;AAGd,IAAA,IAAI,KAAK,UAAA,EAAY;AACjB,MAAA,IAAA,CAAK,YAAY,SAAS,CAAA;AAAA,IAC9B;AAAA,EACJ;AAAA,EA1iCA,IAAY,UAAA,GAA2B;AACnC,IAAA,OAAO,IAAA,CAAK,gBAAA,CACP,MAAA,CAAO,CAAC,CAAA,KAAM;AACX,MAAA,IAAI,CAAC,CAAA,CAAE,OAAA,EAAS,OAAO,KAAA;AACvB,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,aAAA,CAAc,WAAW,CAAA;AACtC,MAAA,IAAI,MAAM,EAAA,KAAO,OAAA,IAAW,EAAA,KAAO,IAAA,CAAK,WAAW,OAAO,KAAA;AAC1D,MAAA,OAAO,IAAA;AAAA,IACX,CAAC,CAAA,CACA,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA,EAmFQ,uBAAA,GAAgC;AACpC,IAAA,IAAI,IAAA,CAAK,qBAAA,EAAuB,YAAA,CAAa,IAAA,CAAK,qBAAqB,CAAA;AACvE,IAAA,IAAA,CAAK,qBAAA,GAAwB,WAAW,MAAM;AAC1C,MAAA,IAAA,CAAK,qBAAA,GAAwB,IAAA;AAC7B,MAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,IACzB,GAAG,GAAG,CAAA;AAAA,EACV;AAAA,EAgCA,IAAY,YAAA,GAAwB;AAChC,IAAA,OAAO,IAAA,CAAK,gBAAA,IAAoB,CAAC,CAAC,QAAA,CAAS,iBAAA;AAAA,EAC/C;AAAA;AAAA,EAEA,IAAY,gBAAA,GAA4B;AACpC,IAAA,OAAA,CACK,IAAA,CAAK,YAAA,EAAc,SAAA,IAAa,KAAA,KACjC,IAAA,CAAK,eAAA,KAAoB,IAAA,KACxB,IAAA,CAAK,gBAAA,EAAkB,MAAA,IAAU,KAAA,CAAA,IAClC,IAAA,CAAK,kBAAkB,IAAA,GAAO,CAAA;AAAA,EAEtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAq7BA,SAAA,GAAkB;AAEd,IAAA,EAAE,IAAA,CAAK,eAAA;AAGP,IAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AACrB,IAAA,IAAA,CAAK,UAAU,KAAK,CAAA;AACpB,IAAA,IAAA,CAAK,eAAe,QAAA,EAAS;AAC7B,IAAA,IAAA,CAAK,SAAS,EAAC;AACf,IAAA,IAAA,CAAK,iBAAA,GAAoB,MAAA;AACzB,IAAA,IAAA,CAAK,yBAAA,GAA4B,IAAA;AACjC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA;AAAA,EAC3B;AAAA,EAEA,QAAA,CAAS,IAAA,EAAkB,MAAA,GAAS,KAAA,EAAa;AAC7C,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AACtB,IAAA,IAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,UAAU,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,IAAA,CAAK,cAAA,GAAiB,CAAA;AACtB,IAAA,IAAA,CAAK,gBAAA,GAAmB,CAAA;AACxB,IAAA,IAAA,CAAK,oBAAA,GAAuB,IAAA;AAC5B,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,IAAA,IAAA,CAAK,SAAA,CAAU,IAAI,IAAI,CAAA;AACvB,IAAA,MAAM,IAAA,GAAA,CACD,KAAK,eAAA,EAAiB,KAAA,IAAS,KAAK,UAAA,CAAW,qBAAA,EAAsB,CAAE,KAAA,IACxE,IAAA,CAAK,cAAA;AACT,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,gBAAA,IAAoB,IAAA,GAAO,IAAI,IAAA,GAAO,MAAA;AAC9D,IAAA,MAAM,eAAA,GAAkB,kBAAA;AAAA,MACpB,IAAA,CAAK,gBAAA;AAAA,MACL,IAAA,CAAK,qBAAA;AAAA,MACL,IAAA,CAAK,kBAAA;AAAA,MACL,IAAA,CAAK,wBAAA;AAAA,MACL,UAAA;AAAA,MACA,IAAA,CAAK;AAAA,KACT;AACA,IAAA,IAAA,CAAK,mBAAA,GAAsB,eAAA;AAC3B,IAAA,IAAA,CAAK,QAAA,GAAW;AAAA,MACZ,GAAG,IAAA,CAAK,QAAA;AAAA,MACR,UAAA,EAAY,SACN,CAAA,GACA,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,MAAA,GAAS,eAAA,GAAkB,SAAS,CAAA;AAAA,MAC3D,QAAA,EAAU,KAAK,MAAA,GAAS;AAAA,KAC5B;AACA,IAAA,IAAA,CAAK,eAAA,GAAkB,EAAE,GAAG,IAAA,CAAK,QAAA,EAAS;AAC1C,IAAA,MAAM,MAAA,GAAS,KAAK,SAAA,CAAU,aAAA;AAC9B,IAAA,IAAI,CAAC,MAAA,EAAQ,IAAA,CAAK,UAAA,GAAa,KAAA;AAC/B,IAAA,IAAA,CAAK,MAAA,EAAQ,gBAAA,CAAiB,IAAA,CAAK,UAAA,EAAY,MAAM,CAAA;AACrD,IAAA,IAAI,IAAA,CAAK,cAAc,MAAA,EAAQ;AAC3B,MAAA,IAAA,CAAK,gBAAA,EAAkB,OAAA;AAAA,QACnB,KAAA;AAAA,QACA,IAAA,CAAK,MAAM,MAAA,CAAO,EAAA;AAAA,QAClB,KAAA;AAAA,QACA,OAAA;AAAA,QACA,IAAA;AAAA,QACA,MAAM;AACF,UAAA,IAAA,CAAK,UAAU,KAAK,CAAA;AACpB,UAAA,IAAA,CAAK,gBAAA,EAAkB,WAAW,KAAK,CAAA;AACvC,UAAA,IAAA,CAAK,MAAA,EAAQ,gBAAA,CAAiB,KAAA,EAAO,IAAA,CAAK,UAAU,aAAa,CAAA;AAAA,QACrE,CAAA;AAAA,QACA,IAAA;AAAA,QACA,MAAM;AACF,UAAA,IAAA,CAAK,SAAA,CAAU,CAAC,IAAA,CAAK,UAAU,CAAA;AAC/B,UAAA,IAAA,CAAK,gBAAA,EAAkB,oBAAA,CAAqB,KAAA,EAAO,IAAA,CAAK,UAAU,CAAA;AAClE,UAAA,IAAA,CAAK,cAAA,EAAe;AAAA,QACxB;AAAA,OACJ;AAAA,IACJ;AACA,IAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,IAAA,IAAA,CAAK,2BAAA,EAA4B;AAIjC,IAAA,IAAI,KAAK,uBAAA,EAAyB;AAC9B,MAAA,MAAM,UAAU,IAAA,CAAK,uBAAA;AACrB,MAAA,IAAA,CAAK,uBAAA,GAA0B,IAAA;AAC/B,MAAA,IAAI,QAAQ,UAAA,EAAY;AACpB,QAAA,IAAA,CAAK,gBAAA,GAAmB,QAAQ,UAAA,CAAW,MAAA;AAC3C,QAAA,IAAA,CAAK,cAAA,GAAiB,QAAQ,UAAA,CAAW,SAAA;AACzC,QAAA,IAAA,CAAK,oBAAA,GAAuB,IAAA;AAC5B,QAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAAA,MAC9B;AACA,MAAA,IAAI,QAAQ,QAAA,EAAU;AAClB,QAAA,IAAA,CAAK,2BAAA;AAAA,UACD,QAAQ,QAAA,CAAS,SAAA;AAAA,UACjB,QAAQ,QAAA,CAAS;AAAA,SACrB;AAAA,MACJ;AAAA,IACJ;AACA,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA,EAGA,YAAY,IAAA,EAAwB;AAChC,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACnB,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,MAAA,OAAO,IAAA;AAAA,IACX;AACA,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA;AACrC,IAAA,IAAI,IAAI,CAAA,EAAG;AACP,MAAA,IAAA,CAAK,QAAA,GAAW;AAAA,QACZ,GAAG,IAAA,CAAK,QAAA;AAAA,QACR,UAAA,EAAY,IAAA,CAAK,QAAA,CAAS,UAAA,GAAa,CAAA;AAAA,QACvC,QAAA,EAAU,IAAA,CAAK,QAAA,CAAS,QAAA,GAAW;AAAA,OACvC;AACA,MAAA,IAAA,CAAK,eAAA,GAAkB,EAAE,GAAG,IAAA,CAAK,QAAA,EAAS;AAC1C,MAAA,IAAA,CAAK,cAAA,CAAe,gBAAgB,CAAC,CAAA;AACrC,MAAA,IAAA,CAAK,2BAAA,EAA4B;AACjC,MAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,MAAA,IAAA,CAAK,cAAA,EAAe;AAAA,IACxB;AACA,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA,EAGA,WAAW,OAAA,EAAwB;AAC/B,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACvB,MAAA,IAAA,CAAK,gBAAA,CAAiB,KAAA,CAAM,OAAA,GAAU,OAAA,GAAU,MAAA,GAAS,MAAA;AAAA,IAC7D;AACA,IAAA,IAAI,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AACjC,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA,EAGQ,UAAU,IAAA,EAAqB;AACnC,IAAA,IAAI,KAAK,eAAA,EAAiB;AACtB,MAAA,IAAA,CAAK,eAAA,CAAgB,KAAA,CAAM,OAAA,GAAU,IAAA,GAAO,MAAA,GAAS,MAAA;AAAA,IACzD;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA,EAIQ,cAAc,EAAA,EAAuB;AACzC,IAAA,MAAM,GAAA,GAAM,GAAA;AACZ,IAAA,MAAM,GAAA,GAAiC;AAAA,MACnC,MAAM,CAAA,GAAI,GAAA;AAAA,MACV,MAAM,CAAA,GAAI,GAAA;AAAA,MACV,OAAO,EAAA,GAAK,GAAA;AAAA,MACZ,OAAO,EAAA,GAAK,GAAA;AAAA,MACZ,MAAM,EAAA,GAAK,GAAA;AAAA,MACX,MAAM,GAAA,GAAM,GAAA;AAAA,MACZ,MAAM,GAAA,GAAM,GAAA;AAAA,MACZ,MAAM,GAAA,GAAM,GAAA;AAAA,MACZ,MAAM,IAAA,GAAO,GAAA;AAAA,MACb,MAAM,KAAA,GAAQ,GAAA;AAAA,MACd,MAAM,KAAA,GAAQ;AAAA,KAClB;AACA,IAAA,OAAO,GAAA,CAAI,EAAE,CAAA,IAAK,IAAA,GAAO,GAAA;AAAA,EAC7B;AAAA;AAAA;AAAA,EAIQ,eAAA,GAA6B;AACjC,IAAA,OAAO,IAAA,CAAK,aAAA,GAAgB,IAAA,CAAK,SAAS,KAAK,IAAA,CAAK,SAAA;AAAA,EACxD;AAAA;AAAA;AAAA,EAIQ,eAAA,GAA2B;AAC/B,IAAA,MAAM,IAAA,GAAO,KAAK,eAAA,EAAgB;AAClC,IAAA,OACI,IAAA,KAAS,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA,GAAI,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,SAAS,CAAA;AAAA,EAE/F;AAAA;AAAA,EAGQ,eAAe,IAAA,EAA8B;AACjD,IAAA,OAAO,IAAA,CAAK,eAAA,EAAgB,GACtB,gBAAA,CAAiB,IAAA,EAAM,KAAK,aAAA,CAAc,IAAA,CAAK,SAAS,CAAC,CAAA,GACzD,IAAA;AAAA,EACV;AAAA,EAEQ,oBAAoB,EAAA,EAAuB;AAC/C,IAAA,MAAM,GAAA,GAAiC;AAAA,MACnC,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,IAAA;AAAA,MACN,IAAA,EAAM,IAAA;AAAA,MACN,IAAA,EAAM,IAAA;AAAA,MACN,IAAA,EAAM,IAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM;AAAA,KACV;AACA,IAAA,OAAO,GAAA,CAAI,EAAE,CAAA,IAAK,MAAA;AAAA,EACtB;AAAA,EAEQ,aAAa,CAAA,EAAqB;AACtC,IAAA,MAAM,GAAA,GAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAC3B,IAAA,MAAM,GAAA,GAAgC;AAAA,MAClC,MAAM,CAAA,GAAI,GAAA;AAAA,MACV,MAAM,CAAA,GAAI,GAAA;AAAA,MACV,MAAM,EAAA,GAAK,GAAA;AAAA,MACX,MAAM,EAAA,GAAK,GAAA;AAAA,MACX,MAAM,GAAA,GAAM,GAAA;AAAA,MACZ,MAAM,GAAA,GAAM,GAAA;AAAA,MACZ,IAAA,EAAM,IAAI,GAAA,GAAM,GAAA;AAAA,MAChB,GAAA,EAAK,KAAK,GAAA,GAAM;AAAA,KACpB;AACA,IAAA,OAAO,GAAA,CAAI,CAAC,CAAA,IAAK,GAAA,GAAM,GAAA;AAAA,EAC3B;AAAA,EAEQ,YAAY,MAAA,EAAoD;AACpE,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACtB,IAAA,MAAM,GAAA,GAAM,EAAE,IAAA,CAAK,eAAA;AACnB,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,MAAM,cAAc,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,KAAK,SAAS,CAAA;AACvE,IAAA,MAAM,aAAa,IAAA,CAAK,QAAA,GAAW,KAAK,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA,GAAI,WAAA;AACtE,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,WAAW,CAAA;AACrD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,mBAAA,CAAoB,IAAA,CAAK,iBAAiB,CAAA;AAChE,IAAA,IAAA,CAAK,WAAW,IAAI,CAAA;AAEpB,IAAA,MAAM,SAAS,IAAA,CAAK,UAAA;AACpB,IAAA,MAAM,gBAAA,GAAmB,CAAC,CAAA,EAAG,CAAA,EAAG,IAAI,GAAG,CAAA;AACvC,IAAA,MAAM,UAAU,IAAA,CAAK,cAAA;AACrB,IAAA,MAAM,MAAM,IAAA,CAAK,aAAA;AAEjB,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,EAAW,KAAA,KAAsB;AAC9C,MAAA,MAAA,CAAO,EAAE,OAAO,GAAA,EAAK,QAAA,EAAU,CAAA,CAC1B,IAAA,CAAK,CAAC,IAAA,KAAS;AACZ,QAAA,IAAI,GAAA,KAAQ,KAAK,eAAA,EAAiB;AAClC,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AAC3C,QAAA,MAAM,aAAa,GAAA,CAAI,OAAA,EAAQ,GAAI,KAAA,CAAM,SAAQ,IAAK,GAAA;AACtD,QAAA,IAAI,WAAW,MAAA,IAAU,OAAA,IAAW,IAAI,CAAA,IAAK,gBAAA,CAAiB,UAAU,UAAA,EAAY;AAChF,UAAA,IAAA,CAAK,QAAA,CAAS,UAAA,EAAY,MAAA,KAAW,UAAU,CAAA;AAC/C,UAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AACrB,UAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,IAAA,CAAK,UAAU,IAAI,CAAA;AAChD,UAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,YAAA,EAAc;AAAA,YAC5B,WAAW,IAAA,CAAK,SAAA;AAAA,YAChB,QAAA;AAAA,YACA,KAAA;AAAA,YACA;AAAA,WACH,CAAA;AACD,UAAA;AAAA,QACJ;AACA,QAAA,MAAM,YAAA,GAAe,KAAK,GAAA,CAAI,YAAA,GAAe,iBAAiB,CAAA,GAAI,CAAC,GAAG,GAAG,CAAA;AACzE,QAAA,MAAM,YAAY,IAAI,IAAA,CAAK,GAAA,CAAI,OAAA,KAAY,YAAY,CAAA;AACvD,QAAA,OAAA,CAAQ,CAAA,GAAI,GAAG,SAAS,CAAA;AAAA,MAC5B,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AACT,QAAA,IAAI,GAAA,KAAQ,KAAK,eAAA,EAAiB;AAClC,QAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,QAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AAAA,MACzB,CAAC,CAAA;AAAA,IACT,CAAA;AAEA,IAAA,MAAM,gBAAgB,IAAA,CAAK,GAAA,CAAI,eAAe,gBAAA,CAAiB,CAAC,GAAG,GAAG,CAAA;AACtE,IAAA,OAAA,CAAQ,GAAG,IAAI,IAAA,CAAK,IAAI,OAAA,EAAQ,GAAI,aAAa,CAAC,CAAA;AAAA,EACtD;AAAA,EAEQ,iBAAA,GAA0B;AAC9B,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,UAAA,IAAc,KAAK,UAAA,EAAY;AAC5D,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,KAAK,iBAAiB,CAAA;AACrD,IAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,UAAA,GAAa,SAAA,EAAW;AACjD,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AAEjC,IAAA,MAAM,MAAM,IAAA,CAAK,eAAA;AACjB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,CAAE,IAAA;AACrC,IAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AAC/B,IAAA,MAAM,cAAc,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,KAAK,SAAS,CAAA;AACvE,IAAA,MAAM,aAAa,IAAA,CAAK,QAAA,GAAW,KAAK,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA,GAAI,WAAA;AACtE,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,WAAW,CAAA;AACrD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,mBAAA,CAAoB,IAAA,CAAK,iBAAiB,CAAA;AAChE,IAAA,IAAA,CAAK,WAAW,IAAI,CAAA;AAEpB,IAAA,MAAM,SAAS,IAAA,CAAK,UAAA;AACpB,IAAA,MAAM,gBAAA,GAAmB,CAAC,CAAA,EAAG,CAAA,EAAG,IAAI,GAAG,CAAA;AACvC,IAAA,MAAM,UAAU,IAAA,CAAK,cAAA;AACrB,IAAA,MAAM,MAAM,IAAA,CAAK,aAAA;AAEjB,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,EAAW,KAAA,KAAsB;AAC9C,MAAA,MAAA,CAAO,EAAE,OAAO,GAAA,EAAK,QAAA,EAAU,CAAA,CAC1B,IAAA,CAAK,CAAC,IAAA,KAAS;AACZ,QAAA,IAAI,GAAA,KAAQ,KAAK,eAAA,EAAiB;AAClC,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AAC3C,QAAA,MAAM,aAAa,GAAA,CAAI,OAAA,EAAQ,GAAI,KAAA,CAAM,SAAQ,IAAK,GAAA;AACtD,QAAA,IAAI,WAAW,MAAA,IAAU,OAAA,IAAW,IAAI,CAAA,IAAK,gBAAA,CAAiB,UAAU,UAAA,EAAY;AAChF,UAAA,IAAA,CAAK,YAAY,UAAU,CAAA;AAC3B,UAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AACrB,UAAA;AAAA,QACJ;AACA,QAAA,MAAM,YAAA,GAAe,KAAK,GAAA,CAAI,YAAA,GAAe,iBAAiB,CAAA,GAAI,CAAC,GAAG,GAAG,CAAA;AACzE,QAAA,MAAM,YAAY,IAAI,IAAA,CAAK,GAAA,CAAI,OAAA,KAAY,YAAY,CAAA;AACvD,QAAA,OAAA,CAAQ,CAAA,GAAI,GAAG,SAAS,CAAA;AAAA,MAC5B,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AACT,QAAA,IAAI,GAAA,KAAQ,KAAK,eAAA,EAAiB;AAClC,QAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,QAAA,IAAA,CAAK,WAAW,KAAK,CAAA;AAAA,MACzB,CAAC,CAAA;AAAA,IACT,CAAA;AAEA,IAAA,MAAM,gBAAgB,IAAA,CAAK,GAAA,CAAI,eAAe,gBAAA,CAAiB,CAAC,GAAG,GAAG,CAAA;AACtE,IAAA,OAAA,CAAQ,GAAG,IAAI,IAAA,CAAK,IAAI,OAAA,EAAQ,GAAI,aAAa,CAAC,CAAA;AAAA,EACtD;AAAA,EAEA,aAAa,SAAA,EAA6B;AACtC,IAAA,IAAI,SAAA,CAAU,SAAS,KAAA,EAAO;AAC1B,MAAA,MAAM,YAAA,GAAe,KAAK,gBAAA,CAAiB,MAAA;AAAA,QACvC,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,CAAU,IAAA,KAAS;AAAA,OAChC,CAAE,MAAA;AACF,MAAA,IAAI,YAAA,IAAgB,IAAA,CAAK,WAAA,EAAa,OAAO,IAAA;AAAA,IACjD;AACA,IAAA,MAAM,MAAA,GAAS,wBAAwB,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,SAAA,KAAc,UAAU,IAAI,CAAA;AACjF,IAAA,MAAM,gBAAiC,MAAA,GACjC,MAAA,CAAO,WAAA,CAAY,MAAA,CAAO,OAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,EAAE,GAAA,EAAK,CAAA,CAAE,OAAO,CAAC,CAAC,IAC/D,EAAC;AACP,IAAA,aAAA,CAAc,WAAW,CAAA,GAAI,OAAA;AAC7B,IAAA,MAAM,KAAA,GAA8B;AAAA,MAChC,SAAA;AAAA,MACA,WAAW,SAAA,CAAU,IAAA;AAAA,MACrB,aAAA,EAAe,aAAA;AAAA,MACf,OAAA,EAAS;AAAA,KACb;AACA,IAAA,IAAA,CAAK,gBAAA,CAAiB,KAAK,KAAK,CAAA;AAChC,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AAC3B,MAAA,IAAA,CAAK,gBAAA,CAAiB,IAAI,SAAA,CAAU,IAAA,EAAM,UAAU,OAAA,CAAQ,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,IACnF;AACA,IAAA,MAAM,WAAA,GAAc,MAAA,KAAW,MAAA,IAAa,MAAA,CAAO,OAAO,MAAA,GAAS,CAAA;AACnE,IAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,SAAA,CAAU,IAAA,EAAM,eAAe,MAAM,CAAA;AACvE,IAAA,IAAI,SAAA,CAAU,SAAS,KAAA,EAAO;AAE1B,MAAA,MAAM,cAAc,IAAI,gBAAA;AAAA,QACpB,IAAA,CAAK,KAAA;AAAA,QACL,KAAK,QAAA,CAAS,gBAAA;AAAA,QACd,KAAK,MAAA,CAAO;AAAA,OAChB;AACA,MAAA,MAAA,CAAO,MAAA,CAAO,WAAA,CAAY,EAAA,CAAG,KAAA,EAAO;AAAA,QAChC,QAAA,EAAU,UAAA;AAAA,QACV,GAAA,EAAK,KAAA;AAAA,QACL,IAAA,EAAM,KAAA;AAAA,QACN,MAAA,EAAQ;AAAA,OACX,CAAA;AACD,MAAA,IAAA,CAAK,UAAA,CAAW,WAAA,CAAY,WAAA,CAAY,EAAE,CAAA;AAC1C,MAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,SAAA,CAAU,IAAA,EAAM,WAAW,CAAA;AACpD,MAAA,WAAA,CAAY,OAAA;AAAA,QACR,SAAA,CAAU,IAAA;AAAA,QACV,SAAA,CAAU,KAAA;AAAA,QACV,KAAA;AAAA,QACA,OAAA;AAAA,QACA,IAAA;AAAA,QACA,MAAM,IAAA,CAAK,eAAA,CAAgB,SAAA,CAAU,IAAI,CAAA;AAAA,QACzC,cAAc,MAAM,IAAA,CAAK,qBAAA,CAAsB,SAAA,CAAU,IAAI,CAAA,GAAI,IAAA;AAAA,QACjE,MAAM;AACF,UAAA,KAAA,CAAM,OAAA,GAAU,CAAC,KAAA,CAAM,OAAA;AACvB,UAAA,WAAA,CAAY,oBAAA,CAAqB,SAAA,CAAU,IAAA,EAAM,KAAA,CAAM,OAAO,CAAA;AAC9D,UAAA,IAAA,CAAK,cAAA,EAAe;AACpB,UAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,QACzB;AAAA,OACJ;AAAA,IACJ,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,gBAAA,EAAkB,OAAA;AAAA,QACnB,SAAA,CAAU,IAAA;AAAA,QACV,SAAA,CAAU,KAAA;AAAA,QACV,KAAA;AAAA,QACA,OAAA;AAAA,QACA,IAAA;AAAA,QACA,MAAM,IAAA,CAAK,eAAA,CAAgB,SAAA,CAAU,IAAI,CAAA;AAAA,QACzC,cAAc,MAAM,IAAA,CAAK,qBAAA,CAAsB,SAAA,CAAU,IAAI,CAAA,GAAI,IAAA;AAAA,QACjE,MAAM;AACF,UAAA,KAAA,CAAM,OAAA,GAAU,CAAC,KAAA,CAAM,OAAA;AACvB,UAAA,IAAA,CAAK,gBAAA,EAAkB,oBAAA,CAAqB,SAAA,CAAU,IAAA,EAAM,MAAM,OAAO,CAAA;AACzE,UAAA,IAAA,CAAK,cAAA,EAAe;AACpB,UAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,QACzB;AAAA,OACJ;AAAA,IACJ;AACA,IAAA,IAAA,CAAK,MAAA,EAAQ,wBAAA,CAAyB,SAAA,CAAU,IAAA,EAAM,IAAI,CAAA;AAC1D,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,gBAAgB,IAAA,EAAoB;AAChC,IAAA,IAAA,CAAK,gBAAA,GAAmB,KAAK,gBAAA,CAAiB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,CAAU,IAAA,KAAS,IAAI,CAAA;AACrF,IAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,IAAI,CAAA;AACjC,IAAA,IAAA,CAAK,mBAAA,CAAoB,OAAO,IAAI,CAAA;AACpC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA;AAChD,IAAA,IAAI,UAAA,EAAY;AACZ,MAAA,UAAA,CAAW,OAAA,EAAQ;AACnB,MAAA,UAAA,CAAW,GAAG,MAAA,EAAO;AACrB,MAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,IAAI,CAAA;AAAA,IACpC,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,gBAAA,EAAkB,WAAW,IAAI,CAAA;AAAA,IAC1C;AACA,IAAA,IAAA,CAAK,MAAA,EAAQ,wBAAA,CAAyB,IAAA,EAAM,KAAK,CAAA;AACjD,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,mBAAmB,SAAA,EAAyB;AAExC,IAAA,IAAI,cAAc,KAAA,EAAO;AACrB,MAAA,IAAA,CAAK,SAAA,CAAU,CAAC,IAAA,CAAK,UAAU,CAAA;AAC/B,MAAA,IAAI,KAAK,UAAA,EAAY;AACjB,QAAA,IAAA,CAAK,gBAAA,EAAkB,OAAA;AAAA,UACnB,KAAA;AAAA,UACA,IAAA,CAAK,MAAM,MAAA,CAAO,EAAA;AAAA,UAClB,KAAA;AAAA,UACA,OAAA;AAAA,UACA,IAAA;AAAA,UACA,MAAM;AACF,YAAA,IAAA,CAAK,UAAU,KAAK,CAAA;AACpB,YAAA,IAAA,CAAK,gBAAA,EAAkB,WAAW,KAAK,CAAA;AACvC,YAAA,IAAA,CAAK,MAAA,EAAQ,gBAAA,CAAiB,KAAA,EAAO,IAAA,CAAK,UAAU,aAAa,CAAA;AAAA,UACrE,CAAA;AAAA,UACA,IAAA;AAAA,UACA,MAAM;AACF,YAAA,IAAA,CAAK,SAAA,CAAU,CAAC,IAAA,CAAK,UAAU,CAAA;AAC/B,YAAA,IAAA,CAAK,gBAAA,EAAkB,oBAAA,CAAqB,KAAA,EAAO,IAAA,CAAK,UAAU,CAAA;AAClE,YAAA,IAAA,CAAK,cAAA,EAAe;AAAA,UACxB;AAAA,SACJ;AAAA,MACJ,CAAA,MAAO;AACH,QAAA,IAAA,CAAK,gBAAA,EAAkB,WAAW,KAAK,CAAA;AAAA,MAC3C;AACA,MAAA,IAAA,CAAK,QAAQ,gBAAA,CAAiB,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,UAAU,aAAa,CAAA;AAC3E,MAAA;AAAA,IACJ;AACA,IAAA,MAAM,SAAS,iBAAA,CAAkB,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,SAAS,CAAA;AACtE,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,IAAI,IAAA,CAAK,iBAAiB,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,SAAA,KAAc,SAAS,CAAA,EAAG;AAC9D,MAAA,IAAA,CAAK,gBAAgB,SAAS,CAAA;AAC9B,MAAA;AAAA,IACJ;AACA,IAAA,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,OAAA,EAAS,CAAA;AAAA,EACtC;AAAA,EAEQ,sBAAsB,SAAA,EAAyB;AACnD,IAAA,MAAM,KAAA,GAAQ,KAAK,gBAAA,CAAiB,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,SAAS,CAAA;AACzE,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,SAAS,uBAAA,CAAwB,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,SAAS,CAAA;AAC5E,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA,EAAG;AAC3C,IAAA,MAAM,eAAA,GAAkB,EAAE,GAAG,MAAA,EAAQ,MAAA,EAAQ,CAAC,GAAG,MAAA,CAAO,MAAA,EAAQ,eAAe,CAAA,EAAE;AACjF,IAAA,IAAA,CAAK,uBAAA,EAAyB,IAAA;AAAA,MAC1B,eAAA;AAAA,MACA,KAAA,CAAM,aAAA;AAAA,MACN,CAAC,SAAA,KAAc,IAAA,CAAK,qBAAA,CAAsB,WAAW,SAAS,CAAA;AAAA,MAC9D,MAAM,IAAA,CAAK,eAAA,CAAgB,SAAS;AAAA,KACxC;AAAA,EACJ;AAAA,EAEQ,qBAAA,CAAsB,WAAmB,SAAA,EAAkC;AAC/E,IAAA,MAAM,QAAA,GAAW,KAAK,gBAAA,CAAiB,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,SAAS,CAAA;AACjF,IAAA,IAAI,aAAa,EAAA,EAAI;AACrB,IAAA,MAAM,SAAS,uBAAA,CAAwB,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,SAAS,CAAA;AAC5E,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,gBAAA,CAAiB,QAAQ,CAAA;AAChD,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,MAAM,EAAE,SAAA,EAAW,EAAA,EAAI,GAAG,eAAc,GAAI,SAAA;AAC5C,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA;AAGjD,IAAA,SAAA,CAAU,SAAA,GAAY,YAAA;AACtB,IAAA,SAAA,CAAU,aAAA,GAAgB,EAAE,GAAG,SAAA,EAAU;AAEzC,IAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,SAAS,CAAA;AACtC,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AAC3B,MAAA,IAAA,CAAK,gBAAA,CAAiB,IAAI,SAAA,EAAW,YAAA,CAAa,QAAQ,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,IACjF;AAEA,IAAA,MAAM,cAAc,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,SAAS,KAAK,IAAA,CAAK,gBAAA;AAChE,IAAA,WAAA,EAAa,eAAA,CAAgB,SAAA,EAAW,YAAA,CAAa,KAAK,CAAA;AAC1D,IAAA,WAAA,EAAa,eAAA;AAAA,MACT,SAAA;AAAA,MACA,mBAAA,CAAoB,SAAA,EAAW,SAAA,CAAU,aAAA,EAAe,MAAM;AAAA,KAClE;AACA,IAAA,WAAA,EAAa,mBAAA,CAAoB,SAAA,EAAY,EAAA,IAAiB,OAAO,CAAA;AACrE,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACzB;AAAA,EAEA,EAAA,CAAkC,OAAU,QAAA,EAA+C;AACvF,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,KAAA,EAAO,QAAQ,CAAA;AAAA,EAC1C;AAAA,EAEQ,WAAW,IAAA,EAAoC;AACnD,IAAA,MAAM,IAAA,GAAO,IAAA,KAAS,MAAA,GAAS,UAAA,GAAa,WAAA;AAC5C,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,oBAAA,CAAqB,IAAI,CAAA;AACxC,IAAA,MAAM,eAAkD,CAAA,GAClD;AAAA,MACI,GAAI,CAAA,CAAE,UAAA,KAAe,UAAa,EAAE,UAAA,EAAY,EAAE,UAAA,EAAW;AAAA,MAC7D,GAAI,CAAA,CAAE,IAAA,KAAS,UAAa,EAAE,IAAA,EAAM,EAAE,IAAA,EAAK;AAAA,MAC3C,GAAI,CAAA,CAAE,QAAA,KAAa,UAAa,EAAE,QAAA,EAAU,EAAE,QAAA,EAAS;AAAA,MACvD,GAAI,CAAA,CAAE,UAAA,KAAe,UAAa,EAAE,UAAA,EAAY,EAAE,UAAA,EAAW;AAAA,MAC7D,GAAI,CAAA,CAAE,SAAA,KAAc,UAAa,EAAE,SAAA,EAAW,EAAE,SAAA,EAAU;AAAA,MAC1D,GAAA,CAAK,CAAA,CAAE,QAAA,IACH,CAAA,CAAE,UAAA,IACF,CAAA,CAAE,MAAA,IACF,CAAA,CAAE,QAAA,IACF,CAAA,CAAE,QAAA,IACF,CAAA,CAAE,gBAAgB,MAAA,IAAa;AAAA,QAC/B,MAAA,EAAQ;AAAA,UACJ,GAAI,CAAA,CAAE,QAAA,KAAa,UAAa,EAAE,EAAA,EAAI,EAAE,QAAA,EAAS;AAAA,UACjD,GAAI,CAAA,CAAE,UAAA,KAAe,UAAa,EAAE,IAAA,EAAM,EAAE,UAAA,EAAW;AAAA,UACvD,GAAI,CAAA,CAAE,MAAA,KAAW,UAAa,EAAE,MAAA,EAAQ,EAAE,MAAA,EAAO;AAAA,UACjD,GAAI,CAAA,CAAE,QAAA,KAAa,UAAa,EAAE,QAAA,EAAU,EAAE,QAAA,EAAS;AAAA,UACvD,GAAI,CAAA,CAAE,QAAA,KAAa,UAAa,EAAE,QAAA,EAAU,EAAE,QAAA,EAAS;AAAA,UACvD,GAAI,CAAA,CAAE,UAAA,KAAe,UAAa,EAAE,UAAA,EAAY,EAAE,UAAA;AAAW;AACjE,OACJ;AAAA,MACA,GAAA,CAAK,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,gBAAgB,MAAA,IAAa;AAAA,QAC9C,MAAA,EAAQ;AAAA,UACJ,GAAI,CAAA,CAAE,QAAA,KAAa,UAAa,EAAE,EAAA,EAAI,EAAE,QAAA,EAAS;AAAA,UACjD,GAAI,CAAA,CAAE,UAAA,KAAe,UAAa,EAAE,IAAA,EAAM,EAAE,UAAA;AAAW;AAC3D;AACJ,KACJ,GACA,MAAA;AACN,IAAA,MAAM,MAAA,GAAS,cAAA;AAAA,MACX,cAAA,CAAe,IAAA,EAAM,IAAA,CAAK,cAAA,GAAiB,IAAI,CAAC,CAAA;AAAA,MAChD;AAAA,KACJ;AACA,IAAA,OAAO,qBAAA,CAAsB,MAAA,EAAQ,IAAA,CAAK,OAAO,CAAA;AAAA,EACrD;AAAA,EAEA,SAAS,KAAA,EAA+B;AACpC,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA;AAClC,IAAA,IAAA,CAAK,MAAA,EAAQ,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAChC,IAAA,IAAA,CAAK,SAAA,EAAW,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AACnC,IAAA,IAAA,CAAK,OAAA,EAAS,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AACjC,IAAA,IAAA,CAAK,WAAA,EAAa,QAAA,CAAS,IAAA,CAAK,KAAA,EAAO,KAAK,cAAc,CAAA;AAC1D,IAAA,IAAA,CAAK,YAAA,EAAc,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AACtC,IAAA,IAAA,CAAK,mBAAA,EAAqB,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAC7C,IAAA,IAAA,CAAK,eAAA,EAAiB,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,uBAAA,EAAyB,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AACjD,IAAA,IAAA,CAAK,mBAAA,EAAqB,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAC7C,IAAA,IAAA,CAAK,yBAAA,EAA0B;AAC/B,IAAA,IAAA,CAAK,uBAAA,EAAwB;AAC7B,IAAA,IAAA,CAAK,6BAAA,EAA8B;AACnC,IAAA,IAAI,KAAK,YAAA,EAAc,IAAA,CAAK,aAAa,KAAA,CAAM,KAAA,GAAQ,KAAK,KAAA,CAAM,QAAA;AAClE,IAAA,IAAI,IAAA,CAAK,aAAa,IAAA,CAAK,WAAA,CAAY,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,MAAA,CAAO,YAAA;AAC/E,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA,EAGA,aAAa,EAAA,EAAqB;AAC9B,IAAA,IAAA,CAAK,SAAA,GAAY,EAAA;AACjB,IAAA,IAAA,CAAK,MAAA,EAAQ,aAAa,EAAE,CAAA;AAC5B,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,iBAAA,EAAmB,EAAE,SAAA,EAAW,IAAI,CAAA;AACtD,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,IAAA,IAAA,CAAK,YAAY,WAAW,CAAA;AAC5B,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA,EAGA,kBAAkB,SAAA,EAAgD;AAC9D,IAAA,IAAA,CAAK,cAAA,GAAiB,SAAA;AACtB,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,SAAS,CAAA;AAC3C,IAAA,IAAA,CAAK,MAAA,EAAQ,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAChC,IAAA,IAAA,CAAK,SAAA,EAAW,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AACnC,IAAA,IAAA,CAAK,OAAA,EAAS,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AACjC,IAAA,IAAA,CAAK,WAAA,EAAa,QAAA,CAAS,IAAA,CAAK,KAAA,EAAO,KAAK,cAAc,CAAA;AAC1D,IAAA,IAAA,CAAK,YAAA,EAAc,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AACtC,IAAA,IAAA,CAAK,mBAAA,EAAqB,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAC7C,IAAA,IAAA,CAAK,eAAA,EAAiB,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AACzC,IAAA,IAAA,CAAK,uBAAA,EAAyB,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AACjD,IAAA,IAAA,CAAK,mBAAA,EAAqB,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA;AAC7C,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,EAAA,EAAkB;AAC1B,IAAA,IAAA,CAAK,QAAA,GAAW,OAAO,OAAA,GACjB,IAAA,CAAK,gBAAe,CAAE,eAAA,GAAkB,QAAA,GACxC,EAAA;AACN,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,UAAU,MAAA,EAA0B;AAChC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,MAAA,EAAQ,UAAU,MAAM,CAAA;AAC7B,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,cAAA,EAAgB,EAAE,QAAQ,CAAA;AAC5C,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,OAAA,EAAwB;AACjC,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,EAAY,OAAO,IAAA;AAC7B,IAAA,IAAA,CAAK,SAAA,GAAY,OAAA;AACjB,IAAA,IAAA,CAAK,MAAA,EAAQ,aAAa,OAAO,CAAA;AACjC,IAAA,IAAI,CAAC,OAAA,EAAS;AACV,MAAA,IAAA,CAAK,aAAa,IAAA,EAAK;AACvB,MAAA,IAAA,CAAK,cAAc,IAAA,EAAK;AACxB,MAAA,IAAI,IAAA,CAAK,oBAAoB,IAAA,EAAM;AAC/B,QAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,MAC1B;AAAA,IACJ;AAEA,IAAA,IAAI,KAAK,mBAAA,EAAqB;AAC1B,MAAA,IAAA,CAAK,oBAAoB,OAAA,EAAQ;AACjC,MAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAAA,IAC/B;AACA,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,WAAA,EAAa,EAAE,SAAS,CAAA;AAC1C,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEQ,aAAA,GAAsB;AAC1B,IAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAW;AACjC,IAAA,IAAA,CAAK,QAAA,GAAW,MAAA;AAChB,IAAA,IAAA,CAAK,MAAA,EAAQ,kBAAkB,MAAS,CAAA;AACxC,IAAA,IAAA,CAAK,SAAA,EAAW,UAAU,MAAS,CAAA;AACnC,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACzB;AAAA,EAEA,UAAU,IAAA,EAAqB;AAC3B,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,YAAA,GAAwB;AACpB,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG,OAAO,KAAA;AAChC,IAAA,IAAA,CAAK,iBAAiB,IAAA,EAAK;AAC3B,IAAA,IAAA,CAAK,iBAAiB,IAAA,EAAK;AAC3B,IAAA,IAAA,CAAK,yBAAyB,IAAA,EAAK;AACnC,IAAA,IAAA,CAAK,qBAAqB,IAAA,EAAK;AAC/B,IAAA,IAAA,CAAK,cAAc,IAAA,EAAK;AACxB,IAAA,IAAA,CAAK,QAAQ,aAAA,EAAc;AAC3B,IAAA,IAAA,CAAK,uBAAA,EAAwB;AAC7B,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA,EAGQ,WAAA,GAAuB;AAC3B,IAAA,OACI,IAAA,CAAK,eAAA,EAAiB,SAAA,KAAc,IAAA,IACpC,IAAA,CAAK,eAAA,EAAiB,SAAA,KAAc,IAAA,IACpC,IAAA,CAAK,uBAAA,EAAyB,SAAA,KAAc,IAAA,IAC5C,IAAA,CAAK,mBAAA,EAAqB,SAAA,KAAc,IAAA,IACxC,IAAA,CAAK,YAAA,EAAc,SAAA,KAAc,IAAA,IACjC,IAAA,CAAK,MAAA,EAAQ,eAAA,KAAoB,IAAA,IAAA,CAChC,IAAA,CAAK,oBAAA,EAAsB,KAAA,CAAM,OAAA,IAAW,MAAA,MAAY,MAAA;AAAA,EAEjE;AAAA;AAAA,EAGQ,WAAA,GAAoB;AACxB,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,eAAA,EAAiB,EAAE,WAAW,IAAA,CAAK,WAAA,IAAe,CAAA;AAAA,EACxE;AAAA,EAMQ,eAAA,GAAwB;AAC5B,IAAA,IAAI,KAAK,gBAAA,EAAkB;AAC3B,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,aAAA,EAAe,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,IAAA,CAAK,QAAA,EAAS,EAAG,CAAA;AAAA,EACpF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAA,GAAuB;AACnB,IAAA,OAAO;AAAA,MACH,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,OAAO,IAAA,CAAK,SAAA;AAAA,MACZ,UAAA,EAAY,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAC1C,WAAW,CAAA,CAAE,SAAA;AAAA,QACb,MAAA,EAAQ,EAAE,GAAG,CAAA,CAAE,aAAA,EAAc;AAAA,QAC7B,SAAS,CAAA,CAAE;AAAA,OACf,CAAE,CAAA;AAAA,MACF,UAAU,IAAA,CAAK,cAAA,CAAe,qBAAoB,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAC5D,GAAG,CAAA;AAAA,QACH,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UACzB,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAKH,WAAW,CAAA,CAAE,SAAA,IAAa,IAAA,CAAK,mBAAA,CAAoB,EAAE,QAAQ;AAAA,SACjE,CAAE;AAAA,OACN,CAAE,CAAA;AAAA,MACF,qBAAqB,IAAA,CAAK,mBAAA;AAAA,MAC1B,oBAAoB,IAAA,CAAK,kBAAA;AAAA,MACzB,YAAA,EACI,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,oBAAoB,CAAA,CAAE,MAAA,GAAS,CAAA,GAC1C,EAAE,GAAG,IAAA,CAAK,oBAAA,EAAqB,GAC/B,MAAA;AAAA,MACV,YAAY,IAAA,CAAK,SAAA;AAAA,MACjB,QAAA,EAAU,KAAK,qBAAA,EAAsB;AAAA,MACrC,UAAA,EACI,IAAA,CAAK,gBAAA,KAAqB,CAAA,IAAO,KAAK,cAAA,KAAmB,CAAA,GACnD,EAAE,MAAA,EAAQ,IAAA,CAAK,gBAAA,EAAkB,SAAA,EAAW,IAAA,CAAK,gBAAe,GAChE;AAAA,KACd;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,qBAAA,GAA4E;AAChF,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAA,KAAW,GAAG,OAAO,MAAA;AAC5C,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,mBAAA,CAAoB,IAAA,CAAK,SAAS,UAAU,CAAA;AACnE,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,mBAAA,CAAoB,IAAA,CAAK,SAAS,QAAQ,CAAA;AAC/D,IAAA,IAAI,SAAA,IAAa,IAAA,IAAQ,OAAA,IAAW,IAAA,EAAM,OAAO,MAAA;AACjD,IAAA,OAAO,EAAE,WAAW,OAAA,EAAQ;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,2BAAA,CAA4B,WAAmB,OAAA,EAAuB;AAC1E,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,mBAAA,CAAoB,SAAS,CAAA;AACrD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,mBAAA,CAAoB,OAAO,CAAA;AACjD,IAAA,IAAA,CAAK,WAAW,EAAE,GAAG,IAAA,CAAK,QAAA,EAAU,YAAY,QAAA,EAAS;AACzD,IAAA,IAAA,CAAK,eAAA,GAAkB,EAAE,GAAG,IAAA,CAAK,QAAA,EAAS;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,KAAA,EAAyB;AAC9B,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,IAAA,IAAI;AAEA,MAAA,IAAA,CAAK,SAAA,CAAU,MAAM,MAAM,CAAA;AAC3B,MAAA,IAAA,CAAK,SAAA,CAAU,MAAM,UAAU,CAAA;AAI/B,MAAA,IAAI,MAAM,KAAA,IAAS,IAAA,EAAM,IAAA,CAAK,QAAA,CAAS,MAAM,KAAK,CAAA;AAGlD,MAAA,IAAI,KAAA,CAAM,aAAa,IAAA,EAAM;AACzB,QAAA,IAAA,CAAK,YAAY,KAAA,CAAM,SAAA;AACvB,QAAA,IAAA,CAAK,WAAW,KAAA,CAAM,QAAA;AACtB,QAAA,IAAA,CAAK,MAAA,EAAQ,YAAA,CAAa,KAAA,CAAM,SAAS,CAAA;AACzC,QAAA,IAAA,CAAK,MAAA,EAAQ,iBAAA,CAAkB,KAAA,CAAM,QAAQ,CAAA;AAC7C,QAAA,IAAA,CAAK,SAAA,EAAW,SAAA,CAAU,KAAA,CAAM,QAAQ,CAAA;AACxC,QAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,MAC9B;AAGA,MAAA,MAAM,gBAAgB,IAAA,CAAK,gBAAA,CAAiB,IAAI,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AAClE,MAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAC9B,QAAA,IAAA,CAAK,gBAAgB,IAAI,CAAA;AAAA,MAC7B;AACA,MAAA,KAAA,MAAW,KAAA,IAAS,MAAM,UAAA,EAAY;AAClC,QAAA,MAAM,MAAA,GAAS,wBAAwB,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,SAAA,KAAc,MAAM,SAAS,CAAA;AAClF,QAAA,IAAI,MAAA,EAAQ;AACR,UAAA,MAAM,SAAA,GAAY,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,MAAM,CAAA;AAC7C,UAAA,IAAA,CAAK,aAAa,SAAS,CAAA;AAE3B,UAAA,MAAM,GAAA,GAAM,KAAK,gBAAA,CAAiB,SAAA;AAAA,YAC9B,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,KAAc,KAAA,CAAM;AAAA,WACjC;AACA,UAAA,IAAI,QAAQ,CAAA,CAAA,EAAI;AACZ,YAAA,MAAM,EAAA,GAAK,IAAA,CAAK,gBAAA,CAAiB,GAAG,CAAA;AACpC,YAAA,IAAI,EAAA,EAAI;AACJ,cAAA,EAAA,CAAG,aAAA,GAAgB,EAAE,GAAG,KAAA,CAAM,MAAA,EAAO;AACrC,cAAA,IAAI,KAAA,CAAM,YAAY,KAAA,EAAO;AACzB,gBAAA,EAAA,CAAG,OAAA,GAAU,KAAA;AACb,gBAAA,MAAM,iBACF,IAAA,CAAK,eAAA,CAAgB,IAAI,KAAA,CAAM,SAAS,KACxC,IAAA,CAAK,gBAAA;AACT,gBAAA,cAAA,EAAgB,oBAAA,CAAqB,KAAA,CAAM,SAAA,EAAW,KAAK,CAAA;AAAA,cAC/D;AACA,cAAA,MAAM,EAAA,GAAM,KAAA,CAAM,MAAA,CAAO,WAAW,CAAA,IAAgB,OAAA;AACpD,cAAA,MAAM,YACF,IAAA,CAAK,eAAA,CAAgB,IAAI,KAAA,CAAM,SAAS,KAAK,IAAA,CAAK,gBAAA;AACtD,cAAA,SAAA,EAAW,mBAAA,CAAoB,KAAA,CAAM,SAAA,EAAW,EAAE,CAAA;AAAA,YACtD;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAMA,MAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAChD,GAAG,CAAA;AAAA,QACH,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AACxB,UAAA,IAAI,CAAA,CAAE,aAAa,IAAA,IAAQ,IAAA,CAAK,UAAU,GAAA,CAAI,MAAA,KAAW,GAAG,OAAO,CAAA;AACnE,UAAA,OAAO,EAAE,GAAG,CAAA,EAAG,QAAA,EAAU,KAAK,mBAAA,CAAoB,CAAA,CAAE,SAAS,CAAA,EAAE;AAAA,QACnE,CAAC;AAAA,OACL,CAAE,CAAA;AACF,MAAA,IAAA,CAAK,cAAA,CAAe,aAAa,gBAAgB,CAAA;AAGjD,MAAA,IAAI,MAAM,mBAAA,EAAqB;AAC3B,QAAA,IAAA,CAAK,8BAA8B,KAAA,CAAM,mBAAA;AACzC,QAAA,IAAA,CAAK,sBAAsB,KAAA,CAAM,mBAAA;AAAA,MACrC;AACA,MAAA,IAAI,MAAM,kBAAA,EAAoB;AAC1B,QAAA,IAAA,CAAK,qBAAqB,KAAA,CAAM,kBAAA;AAAA,MACpC;AACA,MAAA,IAAI,MAAM,YAAA,EAAc;AACpB,QAAA,IAAA,CAAK,uBAAuB,KAAA,CAAM,YAAA;AAAA,MACtC;AACA,MAAA,IAAI,KAAA,CAAM,UAAA,KAAe,KAAA,CAAA,IAAa,IAAA,CAAK,UAAA,EAAY;AACnD,QAAA,IAAA,CAAK,YAAY,KAAA,CAAM,UAAA;AACvB,QAAA,IAAA,CAAK,MAAA,EAAQ,YAAA,CAAa,KAAA,CAAM,UAAU,CAAA;AAAA,MAC9C;AAMA,MAAA,IAAI,MAAM,UAAA,EAAY;AAClB,QAAA,IAAA,CAAK,gBAAA,GAAmB,MAAM,UAAA,CAAW,MAAA;AACzC,QAAA,IAAA,CAAK,cAAA,GAAiB,MAAM,UAAA,CAAW,SAAA;AACvC,QAAA,IAAA,CAAK,oBAAA,GAAuB,IAAA;AAC5B,QAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAAA,MAC9B;AACA,MAAA,IAAI,MAAM,QAAA,EAAU;AAChB,QAAA,IAAI,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG;AAC/B,UAAA,IAAA,CAAK,2BAAA;AAAA,YACD,MAAM,QAAA,CAAS,SAAA;AAAA,YACf,MAAM,QAAA,CAAS;AAAA,WACnB;AAAA,QACJ,CAAA,MAAO;AACH,UAAA,IAAA,CAAK,uBAAA,GAA0B;AAAA,YAC3B,UAAU,KAAA,CAAM,QAAA;AAAA,YAChB,YAAY,KAAA,CAAM;AAAA,WACtB;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,CAAA,SAAE;AACE,MAAA,IAAA,CAAK,gBAAA,GAAmB,KAAA;AAAA,IAC5B;AAEA,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWQ,oBAAoB,GAAA,EAAiC;AACzD,IAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU,GAAA;AAC5B,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,IAAA,IAAI,CAAA,KAAM,GAAG,OAAO,MAAA;AACpB,IAAA,MAAM,KAAA,GAAQ,KAAK,CAAC,CAAA;AACpB,IAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,IAAA,IAAI,CAAA,KAAM,CAAA,EAAG,OAAO,KAAA,CAAM,IAAA;AAC1B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC/B,IAAA,MAAM,OAAO,GAAA,GAAM,QAAA;AACnB,IAAA,IAAI,WAAW,CAAA,EAAG;AACd,MAAA,MAAM,MAAA,GAAS,KAAK,CAAC,CAAA;AACrB,MAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,KAAA,CAAM,IAAA;AAC1B,MAAA,OAAO,KAAA,CAAM,IAAA,GAAO,GAAA,IAAO,MAAA,CAAO,OAAO,KAAA,CAAM,IAAA,CAAA;AAAA,IACnD;AACA,IAAA,IAAI,QAAA,IAAY,IAAI,CAAA,EAAG;AACnB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AACvB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA;AACvB,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,SAAa,KAAA,CAAM,IAAA;AACjC,MAAA,OAAO,KAAK,IAAA,GAAA,CAAQ,GAAA,IAAO,IAAI,CAAA,CAAA,KAAO,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA,CAAA;AAAA,IAC3D;AACA,IAAA,MAAM,EAAA,GAAK,KAAK,QAAQ,CAAA;AACxB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,QAAA,GAAW,CAAC,CAAA;AAC5B,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,EAAA,SAAW,KAAA,CAAM,IAAA;AAC7B,IAAA,OAAO,EAAA,CAAG,IAAA,GAAO,IAAA,IAAQ,EAAA,CAAG,OAAO,EAAA,CAAG,IAAA,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,oBAAoB,EAAA,EAAoB;AAC5C,IAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU,GAAA;AAC5B,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,IAAA,IAAI,CAAA,KAAM,GAAG,OAAO,CAAA;AACpB,IAAA,MAAM,KAAA,GAAQ,KAAK,CAAC,CAAA;AACpB,IAAA,IAAI,CAAC,OAAO,OAAO,CAAA;AACnB,IAAA,IAAI,CAAA,KAAM,GAAG,OAAO,CAAA;AACpB,IAAA,IAAI,EAAA,IAAM,MAAM,IAAA,EAAM;AAClB,MAAA,MAAM,MAAA,GAAS,KAAK,CAAC,CAAA;AACrB,MAAA,IAAI,CAAC,QAAQ,OAAO,CAAA;AACpB,MAAA,MAAMC,MAAAA,GAAQ,MAAA,CAAO,IAAA,GAAO,KAAA,CAAM,IAAA;AAClC,MAAA,OAAOA,MAAAA,GAAQ,CAAA,GAAA,CAAK,EAAA,GAAK,KAAA,CAAM,QAAQA,MAAAA,GAAQ,CAAA;AAAA,IACnD;AACA,IAAA,MAAM,UAAU,CAAA,GAAI,CAAA;AACpB,IAAA,MAAM,OAAA,GAAU,KAAK,OAAO,CAAA;AAC5B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,GAAU,CAAC,CAAA;AAChC,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,EAAS,OAAO,CAAA;AACjC,IAAA,IAAI,EAAA,IAAM,QAAQ,IAAA,EAAM;AACpB,MAAA,MAAMA,MAAAA,GAAQ,OAAA,CAAQ,IAAA,GAAO,OAAA,CAAQ,IAAA;AACrC,MAAA,OAAO,WAAWA,MAAAA,GAAQ,CAAA,GAAA,CAAK,EAAA,GAAK,OAAA,CAAQ,QAAQA,MAAAA,GAAQ,CAAA,CAAA;AAAA,IAChE;AAEA,IAAA,IAAI,EAAA,GAAK,GACL,EAAA,GAAK,OAAA;AACT,IAAA,OAAO,KAAK,EAAA,EAAI;AACZ,MAAA,MAAM,GAAA,GAAO,EAAA,GAAK,EAAA,GAAK,CAAA,IAAM,CAAA;AAC7B,MAAA,IAAA,CAAK,KAAK,GAAG,CAAA,EAAG,IAAA,IAAQ,CAAA,KAAM,IAAI,EAAA,GAAK,GAAA;AAAA,gBAC7B,GAAA,GAAM,CAAA;AAAA,IACpB;AACA,IAAA,MAAM,KAAA,GAAQ,KAAK,EAAE,CAAA;AACrB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,EAAA,GAAK,CAAC,CAAA;AACzB,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,EAAO,OAAO,EAAA;AAC7B,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,GAAO,KAAA,CAAM,IAAA;AACjC,IAAA,OAAO,MAAM,KAAA,GAAQ,CAAA,GAAA,CAAK,EAAA,GAAK,KAAA,CAAM,QAAQ,KAAA,GAAQ,CAAA,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYQ,2BAAA,GAAoC;AACxC,IAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU,GAAA;AAC5B,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACvB,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,cAAA,CAAe,WAAA,EAAY,EAAG;AACrD,MAAA,KAAA,MAAW,EAAA,IAAM,QAAQ,MAAA,EAAQ;AAC7B,QAAA,IAAI,EAAA,CAAG,aAAa,IAAA,EAAM;AACtB,UAAA,MAAM,CAAA,GAAI,IAAA,CAAK,mBAAA,CAAoB,EAAA,CAAG,QAAQ,CAAA;AAC9C,UAAA,IAAI,CAAA,IAAK,IAAA,EAAM,EAAA,CAAG,SAAA,GAAY,CAAA;AAC9B,UAAA;AAAA,QACJ;AACA,QAAA,EAAA,CAAG,QAAA,GAAW,IAAA,CAAK,mBAAA,CAAoB,EAAA,CAAG,SAAS,CAAA;AAAA,MACvD;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,yBAAA,GAAkC;AACtC,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG;AACrC,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,cAAA,CAAe,WAAA,EAAY,EAAG;AACrD,MAAA,KAAA,MAAW,EAAA,IAAM,QAAQ,MAAA,EAAQ;AAC7B,QAAA,IAAI,EAAA,CAAG,aAAa,IAAA,EAAM;AAC1B,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,mBAAA,CAAoB,EAAA,CAAG,QAAQ,CAAA;AAC9C,QAAA,IAAI,CAAA,IAAK,IAAA,EAAM,EAAA,CAAG,SAAA,GAAY,CAAA;AAAA,MAClC;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAA,GAA2B;AACvB,IAAA,IAAA,CAAK,QAAA,CAAS;AAAA,MACV,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,MAAA,EAAQ,aAAA;AAAA,MACR,KAAA,EAAO,MAAA;AAAA,MACP,SAAA,EAAW,IAAA;AAAA,MACX,QAAA,EAAU,MAAA;AAAA,MACV,UAAA,EAAY,IAAA;AAAA,MACZ,YAAY,EAAC;AAAA,MACb,UAAU;AAAC,KACd,CAAA;AACD,IAAA,IAAA,CAAK,2BAAA,GAA8B,IAAA;AACnC,IAAA,YAAA,CAAa,UAAA,CAAW,KAAK,mBAAmB,CAAA;AAChD,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,IAAA,IAAA,CAAK,uBAAuB,EAAC;AAC7B,IAAA,IAAA,CAAK,SAAS,MAAM,CAAA;AACpB,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,UAAU,MAAA,EAAsB;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,YAAA,EAAc,UAAU,MAAM,CAAA;AACnC,IAAA,IAAI,KAAK,YAAA,EAAc;AACnB,MAAA,IAAA,CAAK,aAAa,WAAA,GAAc,MAAA;AAChC,MAAA,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,OAAA,GAAU,MAAA,GAAS,QAAA,GAAW,MAAA;AAAA,IAC1D;AACA,IAAA,IAAA,CAAK,eAAA,EAAiB,iBAAiB,MAAM,CAAA;AAE7C,IAAA,IAAI,IAAA,CAAK,sBAAsB,IAAA,EAAM;AACjC,MAAA,YAAA,CAAa,KAAK,iBAAiB,CAAA;AACnC,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAAA,IAC7B;AACA,IAAA,IAAI,IAAA,CAAK,WAAA;AACL,MAAA,IAAA,CAAK,WAAA,CAAY,MAAM,UAAA,GAAa,IAAA,CAAK,MAAM,EAAA,CAAG,MAAA,CAAO,KAAK,YAAY,CAAA;AAC9E,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,KAAA,EAAuB;AAC5B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,eAAA,EAAiB,SAAS,KAAK,CAAA;AACpC,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEQ,qBAAqB,GAAA,EAA4B;AACrD,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACtB,IAAA,IAAI,CAAC,GAAA,EAAK;AACN,MAAA,IAAA,CAAK,WAAW,SAAA,GAAY,EAAA;AAC5B,MAAA,IAAI,IAAA,CAAK,WAAA,EAAa,IAAA,CAAK,WAAA,CAAY,SAAA,GAAY,EAAA;AACnD,MAAA;AAAA,IACJ;AACA,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,IAAA;AAC5B,IAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,CAAK,KAAA,CAAM,OAAO,EAAA,GAAK,IAAA,CAAK,MAAM,MAAA,CAAO,IAAA;AAC5D,IAAA,MAAM,GAAA,GAAM,CAAC,CAAA,KAAc,CAAA,CAAE,QAAQ,IAAA,CAAK,SAAA,CAAU,mBAAmB,CAAA;AACvE,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KACZ,CAAA,IAAK,OACE,CAAA,GAAI,GAAA,EAAW,QAAQ,CAAC,CAAA,GAAI,MAC7B,CAAA,IAAK,GAAA,GAAA,CACF,IAAI,GAAA,EAAO,OAAA,CAAQ,CAAC,CAAA,GAAI,GAAA,GACzB,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA;AACvB,IAAA,MAAM,EAAA,GAAK,KAAK,MAAA,CAAO,IAAA;AACvB,IAAA,MAAM,YAAA,GAAe,CAAC,EAAA,EAAqB,MAAA,KAAuC;AAC9E,MAAA,EAAA,CAAG,SAAA,GAAY,EAAA;AACf,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAA,EAAK,GAAG,KAAK,MAAA,EAAQ;AAClC,QAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC1C,QAAA,IAAA,CAAK,MAAM,WAAA,GAAc,KAAA;AACzB,QAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AACzC,QAAA,GAAA,CAAI,cAAc,GAAA,GAAM,MAAA;AACxB,QAAA,GAAA,CAAI,KAAA,CAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,QAAA;AAC7B,QAAA,GAAA,CAAI,MAAM,OAAA,GAAU,KAAA;AACpB,QAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AACzC,QAAA,GAAA,CAAI,WAAA,GAAc,GAAA;AAClB,QAAA,GAAA,CAAI,MAAM,KAAA,GAAQ,GAAA;AAClB,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,GAAG,CAAA;AACpB,QAAA,EAAA,CAAG,YAAY,IAAI,CAAA;AAAA,MACvB;AAAA,IACJ,CAAA;AACA,IAAA,YAAA,CAAa,KAAK,UAAA,EAAY;AAAA,MAC1B,CAAC,GAAG,IAAA,EAAM,GAAA,CAAI,IAAI,IAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAAA,MAC5C,CAAC,GAAG,IAAA,EAAM,GAAA,CAAI,IAAI,IAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,QAAQ;AAAA,KAC/C,CAAA;AACD,IAAA,IAAI,KAAK,WAAA,EAAa;AAClB,MAAA,YAAA,CAAa,KAAK,WAAA,EAAa;AAAA,QAC3B,CAAC,GAAG,GAAA,EAAK,GAAA,CAAI,IAAI,GAAG,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAAA,QAC1C,CAAC,EAAA,CAAG,KAAA,EAAO,IAAI,GAAA,CAAI,KAAK,GAAG,KAAK,CAAA;AAAA,QAChC,GAAI,GAAA,CAAI,MAAA,IAAU,IAAA,IAAQ,GAAA,CAAI,WAAW,CAAA,GACnC;AAAA,UACI,CAAC,GAAG,MAAA,EAAQ,MAAA,CAAO,IAAI,MAAM,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,QAAQ;AAAA,YAMvD;AAAC,OACV,CAAA;AAAA,IACL;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,IAAA,EAAoB;AAE3B,IAAA,OAAA,CAAQ,KAAK,iGAAiG,CAAA;AAC9G,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,YAAA,EAAc,QAAQ,IAAI,CAAA;AAC/B,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,GAAA,EAAmB;AAC3B,IAAA,IAAI,KAAK,eAAA,EAAiB,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,iBAAiB,GAAG,CAAA;AACpE,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEQ,WAAA,CAAY,OAAe,GAAA,EAAmB;AAClD,IAAA,MAAM,GAAA,GAAM,KAAK,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AAC1D,IAAA,IAAI,QAAQ,EAAA,EAAI;AAChB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAC3B,IAAA,IAAI,GAAA,CAAI,SAAS,GAAA,EAAK;AAEtB,IAAA,IAAI,CAAC,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,KAAK,CAAA,EAAG;AACrC,MAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,KAAA,EAAO,GAAA,CAAI,IAAI,CAAA;AAAA,IAC/C;AACA,IAAA,MAAM,eAAe,IAAA,CAAK,kBAAA,CAAmB,IAAI,KAAK,CAAA,IAAK,IAAI,IAAA,IAAQ,GAAA;AACvE,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACV,GAAG,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,GAAG,GAAG,CAAA;AAAA,MAC3B,EAAE,GAAG,GAAA,EAAK,IAAA,EAAM,GAAA,EAAI;AAAA,MACpB,GAAG,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,MAAM,CAAC;AAAA,KAChC;AAEA,IAAA,IAAI,KAAA,KAAU,KAAK,eAAA,EAAiB;AAChC,MAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,KAAA,EAAO,GAAG,CAAA;AAAA,IACzC;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,qBAAA,EAAuB;AAAA,MACrC,KAAA;AAAA,MACA,IAAA,EAAM,KAAA,KAAU,IAAA,CAAK,eAAA,GAAkB,UAAW,GAAA,CAAI,IAAA;AAAA,MACtD,OAAA,EAAS,GAAA;AAAA,MACT,YAAA;AAAA,MACA,cAAc,IAAA,CAAK;AAAA,KACtB,CAAA;AACD,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,EAC1B;AAAA,EAEQ,mBAAmB,IAAA,EAAwE;AAC/F,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACvB,MAAA,IAAA,CAAK,kBAAkB,IAAI,cAAA;AAAA,QACvB,IAAA,CAAK,KAAA;AAAA,QACL,CAAC,GAAA,KAAQ;AACL,UAAA,IAAI,KAAK,mBAAA,EAAqB,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,qBAAqB,GAAG,CAAA;AAAA,QAChF,CAAA;AAAA,QACA,MAAM,KAAK,WAAA;AAAY,OAC3B;AACA,MAAA,IAAA,CAAK,eAAA,EAAgB,CAAE,WAAA,CAAY,IAAA,CAAK,gBAAgB,EAAE,CAAA;AAAA,IAC9D;AACA,IAAA,IAAA,CAAK,sBAAsB,IAAA,CAAK,KAAA;AAChC,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,IAAA,CAAK,KAAK,CAAA;AAC5D,IAAA,MAAM,UAAA,GAAa,KAAA,EAAO,IAAA,IAAQ,IAAA,CAAK,YAAA;AAEvC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,qBAAA,EAAsB;AACnD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,KAAA;AAC7B,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AACzC,IAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,GAAA,EAAK,GAAA,EAAK,YAAY,IAAA,CAAK,YAAA,EAAc,KAAK,YAAY,CAAA;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAoB,OAAA,EAAuC;AAEvD,IAAA,OAAA,CAAQ,KAAK,6GAA6G,CAAA;AAC1H,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,eAAe,IAAA,EAAoC;AAC/C,IAAA,IAAA,CAAK,cAAA,CAAe,cAAc,IAAI,CAAA;AACtC,IAAA,IAAA,CAAK,OAAA,EAAS,cAAc,IAAI,CAAA;AAChC,IAAA,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,MAAA,GAAS,IAAA,GAAO,WAAA,GAAc,SAAA;AACpD,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,WAAA,GAAoB;AAChB,IAAA,IAAA,CAAK,eAAe,IAAA,EAAK;AACzB,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,WAAA,GAAoB;AAChB,IAAA,IAAA,CAAK,eAAe,IAAA,EAAK;AACzB,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,eAAA,GAAwB;AACpB,IAAA,IAAA,CAAK,eAAe,OAAA,EAAQ;AAC5B,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,eAAA,GAAwB;AACpB,IAAA,IAAA,CAAK,eAAe,OAAA,EAAQ;AAC5B,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,eAAA,GAAwB;AACpB,IAAA,IAAA,CAAK,eAAe,OAAA,EAAQ;AAC5B,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,iBAAA,GAA0B;AACtB,IAAA,IAAA,CAAK,eAAe,SAAA,EAAU;AAC9B,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,qBAAA,GAA8B;AAC1B,IAAA,IAAA,CAAK,eAAe,cAAA,EAAe;AACnC,IAAA,IAAA,CAAK,uBAAA,EAAwB;AAC7B,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,gBAAA,GAAyB;AACrB,IAAA,IAAA,CAAK,eAAe,QAAA,EAAS;AAC7B,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,aAAA,GAAwC;AACpC,IAAA,OAAO,IAAA,CAAK,eAAe,aAAA,EAAc;AAAA,EAC7C;AAAA;AAAA,EAGA,WAAA,GAAc;AACV,IAAA,OAAO,IAAA,CAAK,eAAe,WAAA,EAAY;AAAA,EAC3C;AAAA;AAAA,EAGA,eAAe,EAAA,EAAY;AACvB,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,cAAA,CAAe,EAAE,CAAA;AAAA,EAChD;AAAA;AAAA,EAGA,kBAAA,GAAqB;AACjB,IAAA,OAAO,IAAA,CAAK,eAAe,kBAAA,EAAmB;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAA,CAAmB,IAAY,KAAA,EAAuC;AAClE,IAAA,IAAA,CAAK,cAAA,CAAe,kBAAA,CAAmB,EAAA,EAAI,KAAK,CAAA;AAChD,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,cAAc,OAAA,EAAkC;AAC5C,IAAA,IAAA,CAAK,aAAA,GAAgB,OAAA;AACrB,IAAA,OAAA,CAAQ,OAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,CAAO,IAAI,CAAC,CAAA;AAC1C,IAAA,OAAA,CAAQ,QAAA,CAAS,CAAC,MAAA,KAAW;AACzB,MAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AACpB,MAAA,IAAI,KAAK,WAAA,EAAa;AAClB,QAAA,IAAA,CAAK,YAAY,KAAA,CAAM,UAAA,GAAa,KAAK,KAAA,CAAM,EAAA,CAAG,OAAO,MAAM,CAAA;AAC/D,QAAA,IAAA,CAAK,WAAA,CAAY,KAAA,GAAQ,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA;AAAA,MAC7C;AACA,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,cAAA,EAAgB,EAAE,QAAQ,CAAA;AAAA,IAChD,CAAC,CAAA;AACD,IAAA,OAAA,CAAQ,OAAA,EAAQ;AAChB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,gBAAA,GAAyB;AACrB,IAAA,IAAA,CAAK,eAAe,UAAA,EAAW;AAC/B,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,MAAA,EAA6D;AAClE,IAAA,MAAM,OACF,MAAA,CAAO,CAAA,IAAK,OACN,OAAO,MAAA,CAAO,MAAM,QAAA,GAChB,IAAI,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,OAAA,KACnB,MAAA,CAAO,CAAA,GACX,KAAK,GAAA,EAAI;AACnB,IAAA,IAAA,CAAK,MAAA,CAAO,EAAE,IAAA,EAAM,GAAA,EAAK,MAAA,CAAO,CAAA,EAAG,GAAA,EAAK,MAAA,CAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,CAAA;AAC7D,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,UACI,IAAA,EACA,QAAA,EACA,QAAA,EACA,IAAA,EACA,QACA,UAAA,EACI;AACJ,IAAA,MAAM,SAAA,GAAwB,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAM;AAC1C,MAAA,IAAI,SAAS,UAAA,EAAY;AACrB,QAAA,MAAM,KAAA,GAAuB;AAAA,UACzB,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,QAAQ,CAAC,CAAA;AAAA,UACzB,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,QAAQ,CAAC,CAAA;AAAA,UACzB,IAAA,EAAM,UAAA;AAAA,UACN,IAAA,EAAM;AAAA,SACV;AACA,QAAA,IAAI,CAAA,CAAE,MAAM,CAAA,KAAM,MAAA,EAAW;AACzB,UAAA,KAAA,CAAM,IAAA,GAAO,MAAA,CAAO,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,QACjC;AACA,QAAA,IAAI,MAAA,KAAW,MAAA,IAAa,CAAA,CAAE,MAAM,MAAM,MAAA,EAAW;AACjD,UAAA,KAAA,CAAM,GAAA,GAAM,MAAA,CAAO,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,QAChC;AACA,QAAA,IAAI,UAAA,KAAe,MAAA,IAAa,CAAA,CAAE,UAAU,MAAM,MAAA,EAAW;AACzD,UAAA,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,CAAA,CAAE,UAAU,CAAC,CAAA;AAAA,QACxC;AACA,QAAA,IAAI,EAAE,MAAM,CAAA,KAAM,QAAW,KAAA,CAAM,IAAA,GAAO,EAAE,MAAM,CAAA;AAClD,QAAA,IAAI,CAAA,CAAE,eAAe,CAAA,KAAM,MAAA;AACvB,UAAA,KAAA,CAAM,aAAA,GAAgB,MAAA,CAAO,CAAA,CAAE,eAAe,CAAC,CAAA;AACnD,QAAA,IAAI,CAAA,CAAE,iBAAiB,CAAA,KAAM,MAAA;AACzB,UAAA,KAAA,CAAM,eAAA,GAAkB,MAAA,CAAO,CAAA,CAAE,iBAAiB,CAAC,CAAA;AACvD,QAAA,IAAI,CAAA,CAAE,oBAAoB,CAAA,EAAG,KAAA,CAAM,kBAAA,GAAqB,IAAA;AACxD,QAAA,IAAI,CAAA,CAAE,WAAW,CAAA,KAAM,MAAA;AACnB,UAAA,KAAA,CAAM,SAAA,GAAY,EAAE,WAAW,CAAA;AACnC,QAAA,IAAI,CAAA,CAAE,MAAM,CAAA,KAAM,MAAA,QAAiB,IAAA,GAAO,MAAA,CAAO,CAAA,CAAE,MAAM,CAAC,CAAA;AAC1D,QAAA,OAAO,KAAA;AAAA,MACX;AACA,MAAA,IAAI,SAAS,SAAA,EAAW;AACpB,QAAA,MAAM,KAAA,GAA2B;AAAA,UAC7B,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,QAAQ,CAAC,CAAA;AAAA,UACzB,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,QAAQ,CAAC,CAAA;AAAA,UACzB,IAAA,EAAM,SAAA;AAAA,UACN,IAAA,EAAO,CAAA,CAAE,MAAM,CAAA,IAAwB,KAAA;AAAA,UACvC,SAAA,EAAY,CAAA,CAAE,WAAW,CAAA,IAA0B,OAAA;AAAA,UACnD,IAAA,EAAM;AAAA,SACV;AACA,QAAA,IAAI,CAAA,CAAE,MAAM,CAAA,KAAM,MAAA,QAAiB,IAAA,GAAO,MAAA,CAAO,CAAA,CAAE,MAAM,CAAC,CAAA;AAC1D,QAAA,IAAI,CAAA,CAAE,MAAM,CAAA,KAAM,MAAA,QAAiB,IAAA,GAAO,MAAA,CAAO,CAAA,CAAE,MAAM,CAAC,CAAA;AAC1D,QAAA,IAAI,CAAA,CAAE,eAAe,CAAA,KAAM,MAAA;AACvB,UAAA,KAAA,CAAM,aAAA,GAAgB,MAAA,CAAO,CAAA,CAAE,eAAe,CAAC,CAAA;AACnD,QAAA,IAAI,CAAA,CAAE,iBAAiB,CAAA,KAAM,MAAA;AACzB,UAAA,KAAA,CAAM,eAAA,GAAkB,MAAA,CAAO,CAAA,CAAE,iBAAiB,CAAC,CAAA;AACvD,QAAA,IAAI,CAAA,CAAE,SAAS,CAAA,KAAM,MAAA,QAAiB,OAAA,GAAU,MAAA,CAAO,CAAA,CAAE,SAAS,CAAC,CAAA;AACnE,QAAA,OAAO,KAAA;AAAA,MACX;AACA,MAAA,OAAO;AAAA,QACH,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,QAAQ,CAAC,CAAA;AAAA,QACzB,KAAA,EAAO,MAAA,CAAO,CAAA,CAAE,QAAQ,CAAC,CAAA;AAAA,QACzB,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,EAAE,MAAM,CAAA,KAAM,SAAY,MAAA,CAAO,CAAA,CAAE,MAAM,CAAC,CAAA,GAAI,MAAA;AAAA,QACpD,IAAA,EAAM;AAAA,OACV;AAAA,IACJ,CAAC,CAAA;AAKD,IAAA,IAAI,IAAA,CAAK,sBAAA,IAA0B,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAA,EAAG;AAChE,MAAA,KAAA,MAAW,SAAS,SAAA,EAAW;AAC3B,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,MAAM,KAAK,CAAA;AACtD,QAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AACtB,QAAA,MAAM,EAAA,GAAK,KAAA;AACX,QAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,KAAM;AACtC,UAAA,IAAI,EAAE,SAAA,EAAW;AACb,YAAA,OAAO,EAAE,KAAA,KAAU,UAAA,GACb,GAAG,aAAA,KAAkB,MAAA,GACrB,GAAG,eAAA,KAAoB,MAAA;AAAA,UACjC;AACA,UAAA,IAAI,EAAE,KAAA,KAAU,MAAA,EAAQ,OAAO,KAAA,CAAM,UAAU,CAAA,CAAE,QAAA;AACjD,UAAA,IAAI,EAAE,KAAA,KAAU,UAAA,EAAY,OAAO,EAAA,CAAG,kBAAkB,CAAA,CAAE,QAAA;AAC1D,UAAA,OAAO,EAAA,CAAG,oBAAoB,CAAA,CAAE,QAAA;AAAA,QACpC,CAAC,CAAA;AACD,QAAA,IAAI,YAAA,EAAc;AACd,UAAA,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AACzC,UAAA,IAAI,IAAA,CAAK,kBAAA,KAAuB,KAAA,CAAM,KAAA,OAAY,kBAAA,GAAqB,IAAA;AAAA,QAC3E;AAAA,MACJ;AAAA,IACJ;AAKA,IAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,IAAA,GAAO,CAAA,EAAG;AACjC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACvC,QAAA,MAAM,GAAA,GAAM,UAAU,CAAC,CAAA;AACvB,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,IAAI,KAAK,CAAA;AACvD,QAAA,IAAI,eAAe,MAAA,EAAW;AAC9B,QAAA,IAAI,GAAA,CAAI,IAAA,KAAS,SAAA,IAAa,GAAA,CAAI,SAAS,UAAA,EAAY;AACvD,QAAA,MAAM,EAAA,GAAK,GAAA;AAGX,QAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,GAAA,CAAI,KAAA,EAAO,GAAG,IAAI,CAAA;AAC9C,QAAA,SAAA,CAAU,CAAC,CAAA,GAAI,EAAE,GAAG,EAAA,EAAI,MAAM,UAAA,EAAW;AAAA,MAC7C;AAAA,IACJ;AAMA,IAAA,MAAM,cAAA,GACF,IAAA,CAAK,eAAA,KAAoB,IAAA,GACnB,KAAK,MAAA,CAAO,IAAA;AAAA,MACR,CAAC,CAAA,KACG,CAAA,CAAE,IAAA,KAAS,IAAA,IACX,EAAE,KAAA,KAAU,IAAA,CAAK,eAAA,IACjB,CAAC,UAAU,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,EAAE,KAAK;AAAA,KAClD,GACA,MAAA;AAEV,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACV,GAAG,KAAK,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAAA,MAC5C,GAAG,SAAA;AAAA,MACH,GAAI,cAAA,GAAiB,CAAC,cAAc,IAAI;AAAC,KAC7C;AAIA,IAAA,IACI,IAAA,CAAK,kBAAA,KAAuB,IAAA,IAC5B,CAAC,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,IAAA,CAAK,kBAAkB,CAAA,EAC9D;AACE,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAAA,IAC9B;AAEA,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,mBAAmB,KAAA,EAAqB;AACpC,IAAA,IAAA,CAAK,MAAA,GAAS,KAAK,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AACzD,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAA,CAAe,KAAA,EAAe,IAAA,EAAsB,SAAA,EAAmC;AAGnF,IAAA,IAAI,KAAK,eAAA,EAAiB;AACtB,MAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,IAAA,CAAK,eAAe,CAAA;AAGzE,MAAA,IAAI,QAAA,EAAU,IAAA,KAAS,IAAA,IAAQ,QAAA,EAAU,cAAc,SAAA,EAAW;AAC9D,QAAA,OAAO,IAAA;AAAA,MACX;AAAA,IACJ;AACA,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAM,KAAA,EAAO,SAAS,CAAA;AAC5C,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,eAAA,CAAgB,OAAe,IAAA,EAA4B;AACvD,IAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,IAAA,MAAM,KAAA,GAAQ,CAAA,QAAA,EAAW,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AACnC,IAAA,MAAM,UAAA,GAAgC;AAAA,MAClC,IAAA,EAAM,SAAA;AAAA,MACN,KAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA,EAAW,QAAA;AAAA,MACX,IAAA,EAAM,EAAE,QAAA,EAAU,IAAA;AAAK,KAC3B;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,CAAC,GAAG,IAAA,CAAK,QAAQ,UAAU,CAAA;AACzC,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,gBAAA,EAAkB;AAAA,MAChC,IAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA,EAAW,QAAA;AAAA,MACX,cAAc,IAAA,CAAK;AAAA,KACtB,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,eAAA,GAAwB;AACpB,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAA,CAAmB,KAAA,EAAe,IAAA,EAAmB,KAAA,EAA4B;AAC7E,IAAA,MAAM,KAAA,GAAQ,IAAA,KAAS,IAAA,GAAO,UAAA,GAAa,YAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AAIxD,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,IAAA,MAAM,kBAAA,GACF,IAAA,KAAS,IAAA,GAAO,MAAA,CAAO,gBAAgB,MAAA,CAAO,eAAA;AAClD,IAAA,MAAM,kBAAkB,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,KAAK,KAAK,EAAC;AAC9D,IAAA,MAAM,aAAa,eAAA,CAAgB,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AAChE,IAAA,MAAM,WAAW,eAAA,CAAgB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AAEhE,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AACjC,MAAA,IAAI,CAAA,CAAE,KAAA,KAAU,KAAA,EAAO,OAAO,CAAA;AAC9B,MAAA,MAAM,KAAA,GAAQ,CAAA;AACd,MAAA,OAAO,IAAA,KAAS,IAAA,GACV,EAAE,GAAG,OAAO,aAAA,EAAe,KAAA,IAAS,MAAA,EAAU,GAC9C,EAAE,GAAG,KAAA,EAAO,eAAA,EAAiB,SAAS,MAAA,EAAU;AAAA,IAC1D,CAAC,CAAA;AAED,IAAA,IAAI,UAAU,IAAA,EAAM;AAIhB,MAAA,IAAI,uBAAuB,MAAA,EAAW;AAClC,QAAA,MAAM,QAAA,GAAW,YAAY,QAAA,IAAY,kBAAA;AACzC,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACV,KAAA;AAAA,UACA,QAAA,EAAU,kBAAA;AAAA,UACV,QAAA;AAAA,UACA,SAAA,EAAW;AAAA,SACd,CAAA;AAAA,MACL;AAGA,MAAA,IAAI,SAAS,MAAA,KAAW,CAAA,EAAG,IAAA,CAAK,iBAAA,CAAkB,OAAO,KAAK,CAAA;AAAA,WACzD,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,KAAA,EAAO,QAAQ,CAAA;AAAA,IACnD,CAAA,MAAO;AACH,MAAA,MAAM,KAAA,GAAQ,UAAA,EAAY,KAAA,IAAS,kBAAA,KAAuB,MAAA;AAC1D,MAAA,MAAM,WACF,UAAA,IAAc,CAAC,WAAW,SAAA,GACpB,UAAA,CAAW,WACV,kBAAA,IAAsB,KAAA;AACjC,MAAA,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,UAAU,KAAA,EAAO,QAAA,EAAU,OAAO,CAAA;AACzD,MAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,KAAA,EAAO,QAAQ,CAAA;AAAA,IAC9C;AAEA,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAA,CAAgB,OAAe,IAAA,EAAyB;AACpD,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AAIvD,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAGnB,IAAA,MAAM,SAAA,GAAY,IAAA,KAAS,IAAA,GAAO,UAAA,GAAa,YAAA;AAC/C,IAAA,MAAM,oBACF,IAAA,KAAS,IAAA,GAAO,MAAM,aAAA,KAAkB,MAAA,GAAY,MAAM,eAAA,KAAoB,MAAA;AAClF,IAAA,MAAM,iBAAA,GACF,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,KAAA,KAAU,SAAA,IAAa,CAAC,CAAA,CAAE,SAAS,CAAA,IAAK,KAAA;AAC7F,IAAA,IAAI,iBAAA,IAAqB,mBAAmB,OAAO,IAAA;AAGnD,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,IAAA,CAAK,cAAA,EAAe;AACvC,IAAA,MAAM,aAAa,IAAA,CAAK,oBAAA,IAAwB,IAAA,CAAK,mBAAA,CAAoB,KAAK,QAAQ,CAAA;AACtF,IAAA,MAAM,SAAS,IAAA,CAAK,YAAA,CAAa,SAAS,KAAA,CAAM,KAAA,EAAO,YAAY,MAAM,CAAA;AACzE,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,KAAA;AAC3B,IAAA,MAAM,eACD,IAAA,KAAS,KAAA,IAAS,SAAS,IAAA,IAAU,IAAA,KAAS,UAAU,IAAA,KAAS,IAAA;AACtE,IAAA,MAAM,QAAA,GAAW,MAAA,IAAU,YAAA,GAAe,EAAA,GAAK,GAAA,CAAA;AAC/C,IAAA,MAAM,eAAe,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,QAAA,EAAU,YAAY,MAAM,CAAA;AAEhF,IAAA,IAAA,CAAK,kBAAA,CAAmB,KAAA,EAAO,IAAA,EAAM,YAAY,CAAA;AAOjD,IAAA,MAAM,gBAAgB,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,KAAK,KAAK,EAAC;AAC5D,IAAA,MAAM,gBAAgB,aAAA,CAAc,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,SAAS,CAAA;AACvE,IAAA,aAAA,CAAc,IAAA,CAAK,EAAE,KAAA,EAAO,SAAA,EAAW,QAAA,EAAU,cAAc,QAAA,EAAU,YAAA,EAAc,KAAA,EAAO,IAAA,EAAM,CAAA;AACpG,IAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,KAAA,EAAO,aAAa,CAAA;AAE/C,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,4BAAA,EAA8B;AAAA,MAC5C,KAAA;AAAA,MACA,WAAA,EAAa,IAAA;AAAA,MACb,KAAA,EAAO,YAAA;AAAA,MACP,cAAc,IAAA,CAAK;AAAA,KACtB,CAAA;AACD,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,gBAAA,EAAkB;AAAA,MAChC,KAAA;AAAA,MACA,QAAA,EAAU,YAAA;AAAA,MACV,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,WAAA,EAAa,IAAA,KAAS,IAAA,GAAO,UAAA,GAAa,YAAA;AAAA,MAC1C,cAAc,IAAA,CAAK;AAAA,KACtB,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,UAAA,CAAW,MAAmB,KAAA,EAAsB;AAChD,IAAA,IAAI,KAAA,EAAO,OAAO,IAAA,CAAK,eAAA,CAAgB,OAAO,IAAI,CAAA;AAElD,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,EAAiB,OAAO,IAAA;AAClC,IAAA,MAAM,aAAa,IAAA,CAAK,eAAA;AACxB,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,UAAU,CAAA;AAG5D,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,IAAA,MAAM,aACF,IAAA,KAAS,IAAA,GAAO,MAAM,aAAA,KAAkB,MAAA,GAAY,MAAM,eAAA,KAAoB,MAAA;AAClF,IAAA,IAAI,YAAY,OAAO,IAAA;AAEvB,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,IAAA,CAAK,cAAA,EAAe;AACvC,IAAA,MAAM,aAAa,IAAA,CAAK,oBAAA,IAAwB,IAAA,CAAK,mBAAA,CAAoB,KAAK,QAAQ,CAAA;AACtF,IAAA,MAAM,SAAS,IAAA,CAAK,YAAA,CAAa,SAAS,KAAA,CAAM,KAAA,EAAO,YAAY,MAAM,CAAA;AACzE,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,KAAA;AAC3B,IAAA,MAAM,eACD,IAAA,KAAS,KAAA,IAAS,SAAS,IAAA,IAAU,IAAA,KAAS,UAAU,IAAA,KAAS,IAAA;AACtE,IAAA,MAAM,QAAA,GAAW,MAAA,IAAU,YAAA,GAAe,EAAA,GAAK,GAAA,CAAA;AAC/C,IAAA,MAAM,eAAe,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,QAAA,EAAU,YAAY,MAAM,CAAA;AAEhF,IAAA,IAAA,CAAK,uBAAA,CAAwB,MAAM,YAAY,CAAA;AAC/C,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,4BAAA,EAA8B;AAAA,MAC5C,KAAA,EAAO,EAAA;AAAA;AAAA,MACP,WAAA,EAAa,IAAA;AAAA,MACb,KAAA,EAAO,YAAA;AAAA,MACP,cAAc,IAAA,CAAK;AAAA,KACtB,CAAA;AACD,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,gBAAA,EAAkB;AAAA,MAChC,KAAA,EAAO,UAAA;AAAA,MACP,QAAA,EAAU,YAAA;AAAA,MACV,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,WAAA,EAAa,IAAA,KAAS,IAAA,GAAO,UAAA,GAAa,YAAA;AAAA,MAC1C,cAAc,IAAA,CAAK;AAAA,KACtB,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAA,CAAc,MAAmB,KAAA,EAAsB;AACnD,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,MAAM,KAAA,GAAS,IAAA,KAAS,IAAA,GAAO,UAAA,GAAa,YAAA;AAC5C,MAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AAIvD,MAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,KAAK,CAAA;AACvF,MAAA,MAAM,cAAA,GACF,cAAA,IAAkB,CAAC,cAAA,CAAe,SAAA,GAC5B,cAAA,CAAe,QAAA,GACf,IAAA,KAAS,IAAA,GACP,KAAA,CAAM,aAAA,GACN,KAAA,CAAM,eAAA;AAClB,MAAA,IAAI,cAAA,KAAmB,QAAW,OAAO,IAAA;AAIzC,MAAA,MAAM,gBAAgB,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,KAAK,KAAK,EAAC;AAC5D,MAAA,MAAM,gBAAgB,aAAA,CAAc,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AACnE,MAAA,aAAA,CAAc,IAAA,CAAK,EAAE,KAAA,EAAO,QAAA,EAAU,gBAAgB,QAAA,EAAU,cAAA,EAAgB,SAAA,EAAW,IAAA,EAAM,CAAA;AACjG,MAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,KAAA,EAAO,aAAa,CAAA;AAC/C,MAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,MAAA,OAAO,IAAA;AAAA,IACX;AACA,IAAA,IAAI,SAAS,IAAA,EAAM;AACf,MAAA,IAAA,CAAK,kBAAkB,EAAE,GAAG,IAAA,CAAK,eAAA,EAAiB,IAAI,MAAA,EAAU;AAAA,IACpE,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,kBAAkB,EAAE,GAAG,IAAA,CAAK,eAAA,EAAiB,IAAI,MAAA,EAAU;AAAA,IACpE;AACA,IAAA,OAAO,IAAA,CAAK,uBAAA,CAAwB,IAAA,EAAM,IAAI,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,oBAAA,CAAqB,OAAe,KAAA,EAAqB;AACrD,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AACvD,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,IAAA,MAAM,kBAAkB,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,KAAK,KAAK,EAAC;AAC9D,IAAA,MAAM,YAAY,eAAA,CAAgB,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,MAAM,CAAA;AAGhE,IAAA,MAAM,QAAA,GAAW,SAAA,GAAY,SAAA,CAAU,QAAA,GAAW,KAAA,CAAM,KAAA;AACxD,IAAA,MAAM,WAAW,eAAA,CAAgB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,MAAM,CAAA;AACjE,IAAA,QAAA,CAAS,KAAK,EAAE,KAAA,EAAO,QAAQ,QAAA,EAAU,KAAA,EAAO,UAAU,CAAA;AAC1D,IAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,KAAA,EAAO,QAAQ,CAAA;AAE1C,IAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AACd,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,kBAAA,CAAmB,MAAmB,OAAA,EAA8B;AAChE,IAAA,IAAI,SAAS,IAAA,EAAM;AACf,MAAA,IAAA,CAAK,kBAAkB,EAAE,GAAG,KAAK,eAAA,EAAiB,EAAA,EAAI,WAAW,MAAA,EAAU;AAAA,IAC/E,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,kBAAkB,EAAE,GAAG,KAAK,eAAA,EAAiB,EAAA,EAAI,WAAW,MAAA,EAAU;AAAA,IAC/E;AACA,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,uBAAA,CAAwB,MAAmB,KAAA,EAA4B;AACnE,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,EAAiB,OAAO,IAAA;AAClC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AACjC,MAAA,IAAI,CAAA,CAAE,KAAA,KAAU,IAAA,CAAK,eAAA,EAAiB,OAAO,CAAA;AAC7C,MAAA,MAAM,KAAA,GAAQ,CAAA;AACd,MAAA,OAAO,IAAA,KAAS,IAAA,GACV,EAAE,GAAG,OAAO,aAAA,EAAe,KAAA,IAAS,MAAA,EAAU,GAC9C,EAAE,GAAG,KAAA,EAAO,eAAA,EAAiB,SAAS,MAAA,EAAU;AAAA,IAC1D,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,sBAAsB,KAAA,EAAwB;AAC1C,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,EAAiB,OAAO,KAAA;AAElC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AACjC,MAAA,IAAI,CAAA,CAAE,KAAA,KAAU,IAAA,CAAK,eAAA,EAAiB,OAAO,CAAA;AAC7C,MAAA,OAAO,EAAE,GAAI,CAAA,EAAyB,KAAA,EAAM;AAAA,IAChD,CAAC,CAAA;AAED,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,KAAK,eAAe,CAAA;AAC/D,IAAA,IAAI,OAAA,EAAS;AACT,MAAA,MAAM,OAAO,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,MAAM,CAAA;AACnD,MAAA,IAAI,IAAA,OAAW,QAAA,GAAW,KAAA;AAAA,IAC9B;AAEA,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAgB,KAAA,EAAqB;AACjC,IAAA,IAAA,CAAK,0BAA0B,KAAK,CAAA;AACpC,IAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,KAAK,CAAA;AACnC,IAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,EAAG;AACnC,MAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,KAAK,CAAA;AACnC,MAAA,MAAM,GAAA,GAAM,KAAK,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AAC1D,MAAA,IAAI,QAAQ,EAAA,IAAM,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,KAAK,CAAA,EAAG;AAClD,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,KAAK,CAAA;AAC9C,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAC3B,QAAA,IAAA,CAAK,MAAA,GAAS;AAAA,UACV,GAAG,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,GAAG,GAAG,CAAA;AAAA,UAC3B,EAAE,GAAG,GAAA,EAAK,IAAA,EAAM,IAAA,EAAK;AAAA,UACrB,GAAG,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,MAAM,CAAC;AAAA,SAChC;AAAA,MACJ;AACA,MAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,KAAK,CAAA;AAAA,IACxC;AACA,IAAA,IAAI,KAAA,MAAW,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,kBAAA,CAAA,EAAqB;AAC7D,MAAA,IAAA,CAAK,kBAAkB,EAAC;AAAA,IAC5B;AACA,IAAA,IAAI,IAAA,CAAK,kBAAA,KAAuB,KAAA,EAAO,IAAA,CAAK,kBAAA,GAAqB,IAAA;AACjE,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,iBAAA,GAA0B;AACtB,IAAA,IAAI,KAAK,eAAA,EAAiB;AACtB,MAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,IACzB,CAAA,MAAA,IAAW,KAAK,kBAAA,EAAoB;AAChC,MAAA,IAAA,CAAK,oBAAA,CAAqB,KAAK,kBAAkB,CAAA;AAAA,IACrD;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,YAAY,KAAA,EAA4B;AAIpC,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,IAAmB,KAAA,KAAU,KAAK,kBAAA,EAAoB;AAC5D,MAAA,IAAA,CAAK,kBAAkB,EAAC;AAAA,IAC5B;AACA,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAA;AAC1B,IAAA,IAAI,UAAU,IAAA,EAAM;AAChB,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAEjB,MAAA,MAAM,OAAA,GAAU,KAAK,YAAA,CAAa,IAAA;AAAA,QAAK,CAAC,CAAA,KACpC,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,KAAA,KAAU,KAAK;AAAA,OACjD;AACA,MAAA,IAAI,OAAA,EAAS,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,EAAE,CAAA;AAAA,IACrD;AACA,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA,EAGA,0BAA0B,OAAA,EAAwB;AAC9C,IAAA,IAAA,CAAK,sBAAA,GAAyB,OAAA;AAC9B,IAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAC5B,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA,EAGA,4BAA4B,EAAA,EAAkB;AAC1C,IAAA,IAAA,CAAK,wBAAA,GAA2B,EAAA;AAChC,IAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAC5B,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,yBAAyB,KAAA,EAAqB;AAC1C,IAAA,IAAA,CAAK,qBAAA,GAAwB,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,KAAA,EAAO,CAAC,GAAG,CAAC,CAAA;AAC3D,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,OAAO,IAAA;AAAA,EACX;AAAA,EAEA,OAAA,GAAgB;AACZ,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,WAAW,OAAA,EAAQ;AACxB,IAAA,IAAA,CAAK,YAAY,OAAA,EAAQ;AACzB,IAAA,IAAA,CAAK,eAAe,UAAA,EAAW;AAC/B,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,IAAA,CAAK,kBAAkB,OAAA,EAAQ;AAC/B,IAAA,KAAA,MAAW,WAAW,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAO,UAAW,OAAA,EAAQ;AACrE,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,IAAA,IAAA,CAAK,yBAAyB,OAAA,EAAQ;AACtC,IAAA,IAAA,CAAK,qBAAqB,OAAA,EAAQ;AAClC,IAAA,IAAA,CAAK,iBAAiB,OAAA,EAAQ;AAC9B,IAAA,IAAA,CAAK,cAAc,OAAA,EAAQ;AAC3B,IAAA,IAAA,CAAK,qBAAqB,OAAA,EAAQ;AAClC,IAAA,IAAA,CAAK,iBAAiB,OAAA,EAAQ;AAC9B,IAAA,IAAA,CAAK,SAAS,OAAA,EAAQ;AACtB,IAAA,IAAA,CAAK,UAAA,CAAW,mBAAA,CAAoB,WAAA,EAAa,IAAA,CAAK,WAAW,CAAA;AACjE,IAAA,IAAA,CAAK,UAAA,CAAW,mBAAA,CAAoB,YAAA,EAAc,IAAA,CAAK,YAAY,CAAA;AACnE,IAAA,IAAA,CAAK,UAAA,CAAW,mBAAA,CAAoB,WAAA,EAAa,IAAA,CAAK,aAAa,CAAA;AACnE,IAAA,IAAA,CAAK,UAAA,CAAW,mBAAA,CAAoB,UAAA,EAAY,IAAA,CAAK,aAAa,CAAA;AAClE,IAAA,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,IAAA,CAAK,SAAS,CAAA;AACpD,IAAA,IAAA,CAAK,UAAA,CAAW,mBAAA,CAAoB,YAAA,EAAc,IAAA,CAAK,mBAAmB,CAAA;AAC1E,IAAA,IAAA,CAAK,UAAA,CAAW,mBAAA,CAAoB,WAAA,EAAa,IAAA,CAAK,kBAAkB,CAAA;AACxE,IAAA,IAAA,CAAK,UAAA,CAAW,mBAAA,CAAoB,UAAA,EAAY,IAAA,CAAK,iBAAiB,CAAA;AACtE,IAAA,QAAA,CAAS,mBAAA,CAAoB,SAAA,EAAW,IAAA,CAAK,SAAS,CAAA;AACtD,IAAA,IAAA,CAAK,eAAe,UAAA,EAAW;AAC/B,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,IAAA,EAAM,oBAAA,CAAqB,KAAK,KAAK,CAAA;AACxD,IAAA,IAAI,IAAA,CAAK,YAAA,KAAiB,IAAA,EAAM,oBAAA,CAAqB,KAAK,YAAY,CAAA;AACtE,IAAA,IAAA,CAAK,iBAAA,EAAkB;AACvB,IAAA,IAAA,CAAK,cAAc,MAAA,EAAO;AAC1B,IAAA,IAAA,CAAK,aAAa,MAAA,EAAO;AACzB,IAAA,IAAA,CAAK,sBAAsB,MAAA,EAAO;AAClC,IAAA,IAAA,CAAK,QAAQ,MAAA,EAAO;AAAA,EACxB;AAAA;AAAA,EAIQ,yBAAA,GAA4C;AAChD,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC3C,IAAA,MAAA,CAAO,MAAA,CAAO,OAAO,KAAA,EAAO;AAAA,MACxB,QAAA,EAAU,OAAA;AAAA,MACV,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,GAAA,EAAK,KAAA;AAAA,MACL,MAAA,EAAQ,OAAA;AAAA,MACR,UAAA,EAAY,KAAK,KAAA,CAAM,UAAA;AAAA,MACvB,MAAA,EAAQ,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MAC1C,YAAA,EAAc,KAAA;AAAA,MACd,OAAA,EAAS,KAAA;AAAA,MACT,SAAA,EAAW,6BAAA;AAAA,MACX,aAAA,EAAe;AAAA,KAClB,CAAA;AAED,IAAA,MAAM,KAAA,GAAQ,CAAC,IAAA,EAAc,KAAA,EAAe,MAAA,KAAuC;AAC/E,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,MAAA,GAAA,CAAI,KAAA,GAAQ,KAAA;AACZ,MAAA,GAAA,CAAI,SAAA,GAAY,IAAA;AAChB,MAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,QACrB,OAAA,EAAS,MAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB,QAAA;AAAA,QAChB,KAAA,EAAO,MAAA;AAAA,QACP,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,GAAA;AAAA,QACT,MAAA,EAAQ,MAAA;AAAA,QACR,YAAA,EAAc,KAAA;AAAA,QACd,UAAA,EAAY,aAAA;AAAA,QACZ,OAAO,MAAA,GAAS,IAAA,CAAK,MAAM,MAAA,CAAO,IAAA,GAAO,KAAK,KAAA,CAAM,QAAA;AAAA,QACpD,MAAA,EAAQ,SAAA;AAAA,QACR,UAAA,EAAY;AAAA,OACf,CAAA;AACD,MAAA,GAAA,CAAI,gBAAA,CAAiB,gBAAgB,MAAM;AACvC,QAAA,GAAA,CAAI,KAAA,CAAM,UAAA,GAAa,MAAA,GACjB,CAAA,EAAG,IAAA,CAAK,MAAM,MAAA,CAAO,IAAI,CAAA,EAAA,CAAA,GACzB,IAAA,CAAK,KAAA,CAAM,UAAA;AAAA,MACrB,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,gBAAA,CAAiB,gBAAgB,MAAM;AACvC,QAAA,GAAA,CAAI,MAAM,UAAA,GAAa,aAAA;AAAA,MAC3B,CAAC,CAAA;AACD,MAAA,OAAO,GAAA;AAAA,IACX,CAAA;AAEA,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,UAAA,EAAY,gBAAA,EAAkB,IAAI,CAAA;AAC1D,IAAA,SAAA,CAAU,gBAAA,CAAiB,aAAA,EAAe,CAAC,CAAA,KAAM;AAC7C,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,IAAA,CAAK,qBAAA,EAAsB;AAC3B,MAAA,IAAA,CAAK,uBAAA,EAAwB;AAAA,IACjC,CAAC,CAAA;AAED,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,UAAA,EAAY,UAAA,EAAY,KAAK,CAAA;AACpD,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAA,EAAe,CAAC,CAAA,KAAM;AAC5C,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,IAAA,CAAK,cAAA,CAAe,cAAc,IAAI,CAAA;AACtC,MAAA,IAAA,CAAK,uBAAA,EAAwB;AAC7B,MAAA,IAAA,CAAK,cAAA,EAAe;AAAA,IACxB,CAAC,CAAA;AAED,IAAA,MAAA,CAAO,YAAY,SAAS,CAAA;AAC5B,IAAA,MAAA,CAAO,YAAY,QAAQ,CAAA;AAC3B,IAAA,IAAA,CAAK,OAAA,CAAQ,YAAY,MAAM,CAAA;AAC/B,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEQ,uBAAA,CAAwB,SAAiB,OAAA,EAAuB;AACpE,IAAA,IAAI,CAAC,gBAAe,EAAG;AACvB,IAAA,IAAI,CAAC,KAAK,oBAAA,EAAsB;AAC5B,MAAA,IAAA,CAAK,oBAAA,GAAuB,KAAK,yBAAA,EAA0B;AAAA,IAC/D;AACA,IAAA,MAAM,SAAS,IAAA,CAAK,oBAAA;AACpB,IAAA,MAAM,aAAa,MAAA,CAAO,KAAA,CAAM,YAAY,MAAA,IAAU,MAAA,CAAO,MAAM,OAAA,KAAY,EAAA;AAC/E,IAAA,MAAA,CAAO,MAAM,OAAA,GAAU,MAAA;AAGvB,IAAA,qBAAA,CAAsB,MAAM;AACxB,MAAA,MAAM,EAAA,GAAK,OAAO,WAAA,IAAe,EAAA;AACjC,MAAA,MAAM,EAAA,GAAK,OAAO,YAAA,IAAgB,EAAA;AAClC,MAAA,MAAM,KAAK,MAAA,CAAO,UAAA;AAClB,MAAA,MAAM,KAAK,MAAA,CAAO,WAAA;AAClB,MAAA,MAAM,GAAA,GAAM,EAAA;AACZ,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,OAAA,GAAU,EAAA,GAAK,CAAA,EAAG,CAAC,CAAA,EAAG,EAAA,GAAK,EAAA,GAAK,CAAC,CAAA;AAChE,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,OAAA,GAAU,EAAA,GAAK,GAAA,EAAK,CAAC,CAAA,EAAG,EAAA,GAAK,EAAA,GAAK,CAAC,CAAA;AACjE,MAAA,MAAA,CAAO,KAAA,CAAM,IAAA,GAAO,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA;AAC3B,MAAA,MAAA,CAAO,KAAA,CAAM,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,EAAA,CAAA;AAAA,IAC7B,CAAC,CAAA;AAED,IAAA,IAAI,CAAC,UAAA,EAAY,IAAA,CAAK,WAAA,EAAY;AAAA,EACtC;AAAA,EAEQ,uBAAA,GAAgC;AACpC,IAAA,IAAI,KAAK,oBAAA,EAAsB;AAC3B,MAAA,MAAM,UAAA,GAAa,KAAK,oBAAA,CAAqB,KAAA,CAAM,YAAY,MAAA,IACxD,IAAA,CAAK,oBAAA,CAAqB,KAAA,CAAM,OAAA,KAAY,EAAA;AACnD,MAAA,IAAA,CAAK,oBAAA,CAAqB,MAAM,OAAA,GAAU,MAAA;AAC1C,MAAA,IAAI,UAAA,OAAiB,WAAA,EAAY;AAAA,IACrC;AAAA,EACJ;AAAA,EAEQ,6BAAA,GAAsC;AAC1C,IAAA,IAAI,CAAC,KAAK,oBAAA,EAAsB;AAChC,IAAA,MAAM,IAAI,IAAA,CAAK,oBAAA;AACf,IAAA,CAAA,CAAE,KAAA,CAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,UAAA;AAChC,IAAA,CAAA,CAAE,KAAA,CAAM,MAAA,GAAS,CAAA,UAAA,EAAa,IAAA,CAAK,MAAM,UAAU,CAAA,CAAA;AACnD,IAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAA,CAAE,gBAAA,CAAoC,QAAQ,CAAC,CAAA;AACvE,IAAA,MAAM,CAAC,SAAA,EAAW,QAAQ,CAAA,GAAI,IAAA;AAC9B,IAAA,IAAI,WAAW,SAAA,CAAU,KAAA,CAAM,KAAA,GAAQ,IAAA,CAAK,MAAM,MAAA,CAAO,IAAA;AACzD,IAAA,IAAI,QAAA,EAAU,QAAA,CAAS,KAAA,CAAM,KAAA,GAAQ,KAAK,KAAA,CAAM,QAAA;AAAA,EACpD;AAAA;AAAA,EAIQ,cAAA,GAAuB;AAC3B,IAAA,IAAI,KAAK,YAAA,EAAc;AACvB,IAAA,IAAI,IAAA,CAAK,UAAU,IAAA,EAAM;AACzB,IAAA,IAAA,CAAK,KAAA,GAAQ,sBAAsB,MAAM;AACrC,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,MAAA,IAAA,CAAK,MAAA,EAAO;AACZ,MAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,IAC1B,CAAC,CAAA;AAAA,EACL;AAAA,EAEQ,kBAAA,GAA2B;AAC/B,IAAA,IAAI,IAAA,CAAK,mBAAmB,IAAA,EAAM;AAClC,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,MAAM,IAAA,GAAO,CAAC,GAAA,KAAgB;AAC1B,MAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACvB,QAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,QAAA;AAAA,MACJ;AACA,MAAA,IAAI,GAAA,GAAM,YAAY,GAAA,EAAM;AACxB,QAAA,QAAA,GAAW,GAAA;AACX,QAAA,IAAA,CAAK,cAAA,EAAe;AAAA,MACxB;AACA,MAAA,IAAA,CAAK,cAAA,GAAiB,sBAAsB,IAAI,CAAA;AAAA,IACpD,CAAA;AACA,IAAA,IAAA,CAAK,cAAA,GAAiB,sBAAsB,IAAI,CAAA;AAAA,EACpD;AAAA,EAEQ,iBAAA,GAA0B;AAC9B,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,IAAA,IAAI,IAAA,CAAK,mBAAmB,IAAA,EAAM;AAC9B,MAAA,oBAAA,CAAqB,KAAK,cAAc,CAAA;AACxC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IAC1B;AAAA,EACJ;AAAA,EAEQ,oBAAA,GAA6B;AACjC,IAAA,MAAM,QAAA,GAAwB,CAAC,IAAA,EAAM,IAAA,EAAM,OAAO,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA;AAC/E,IAAA,MAAM,UACF,IAAA,CAAK,yBAAA,KAA8B,QAC7B,IAAA,GAAA,CACC,IAAA,CAAK,6BAA6B,QAAA,EAAU,QAAA;AAAA,MACzC,IAAA,CAAK;AAAA,KACT;AACV,IAAA,MAAM,MAAA,GAAA,CACD,KAAK,mBAAA,IAAuB,IAAA,CAAK,2BAClC,OAAA,IACA,IAAA,CAAK,UAAU,MAAA,GAAS,CAAA;AAC5B,IAAA,IAAI,MAAA,IAAU,CAAC,IAAA,CAAK,eAAA,EAAiB;AACjC,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,MAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,IAC5B,CAAA,MAAA,IAAW,CAAC,MAAA,IAAU,IAAA,CAAK,eAAA,EAAiB;AACxC,MAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,IAC3B;AAAA,EACJ;AAAA,EAEQ,iBAAA,GAA0B;AAC9B,IAAA,IAAI,CAAC,KAAK,mBAAA,EAAqB;AAC3B,MAAA,IAAA,CAAK,sBAAsB,IAAI,mBAAA;AAAA,QAC3B,IAAA,CAAK,KAAA;AAAA,QACL;AAAA,UACI,oBAAoB,IAAA,CAAK,kBAAA;AAAA,UACzB,qBAAqB,IAAA,CAAK,mBAAA;AAAA,UAC1B,OAAO,IAAA,CAAK,SAAA;AAAA,UACZ,uBAAuB,IAAA,CAAK,qBAAA;AAAA,UAC5B,wBAAwB,IAAA,CAAK;AAAA,SACjC;AAAA,QACA,KAAK,MAAA,CAAO,OAAA;AAAA,QACZ,CAAC,CAAC,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,SAAA;AAAA,QAC9B,IAAA,CAAK,iBAAA;AAAA,QACL,MAAM,KAAK,WAAA;AAAY,OAC3B;AACA,MAAA,IAAA,CAAK,eAAA,EAAgB,CAAE,WAAA,CAAY,IAAA,CAAK,oBAAoB,EAAE,CAAA;AAAA,IAClE;AACA,IAAA,IAAA,CAAK,mBAAA,CAAoB,IAAA;AAAA,MACrB;AAAA,QACI,oBAAoB,IAAA,CAAK,kBAAA;AAAA,QACzB,qBAAqB,IAAA,CAAK,mBAAA;AAAA,QAC1B,OAAO,IAAA,CAAK,SAAA;AAAA,QACZ,uBAAuB,IAAA,CAAK,qBAAA;AAAA,QAC5B,wBAAwB,IAAA,CAAK,sBAAA;AAAA,QAC7B,YAAA,EAAc,EAAE,GAAG,IAAA,CAAK,oBAAA;AAAqB,OACjD;AAAA,MACA,CAAC,QAAA,KAA4B;AACzB,QAAA,IAAA,CAAK,qBAAqB,QAAA,CAAS,kBAAA;AACnC,QAAA,IAAA,CAAK,8BAA8B,QAAA,CAAS,mBAAA;AAC5C,QAAA,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,mBAAA,EAAqB,QAAA,CAAS,mBAAmB,CAAA;AAC3E,QAAA,IAAA,CAAK,sBAAsB,QAAA,CAAS,mBAAA;AACpC,QAAA,IAAI,SAAS,YAAA,EAAc;AACvB,UAAA,IAAA,CAAK,uBAAuB,QAAA,CAAS,YAAA;AAAA,QACzC;AACA,QAAA,IAAI,IAAA,CAAK,qBAAA,KAA0B,QAAA,CAAS,qBAAA,EAAuB;AAC/D,UAAA,IAAA,CAAK,wBAAwB,QAAA,CAAS,qBAAA;AACtC,UAAA,IAAI;AACA,YAAA,YAAA,CAAa,OAAA;AAAA,cACT,IAAA,CAAK,uBAAA;AAAA,cACL,MAAA,CAAO,SAAS,qBAAqB;AAAA,aACzC;AAAA,UACJ,CAAA,CAAA,MAAQ;AAAA,UAAiC;AAAA,QAC7C;AACA,QAAA,IAAI,IAAA,CAAK,sBAAA,KAA2B,QAAA,CAAS,sBAAA,EAAwB;AACjE,UAAA,IAAA,CAAK,yBAAyB,QAAA,CAAS,sBAAA;AACvC,UAAA,IAAI;AACA,YAAA,YAAA,CAAa,OAAA;AAAA,cACT,IAAA,CAAK,2BAAA;AAAA,cACL,MAAA,CAAO,SAAS,sBAAsB;AAAA,aAC1C;AAAA,UACJ,CAAA,CAAA,MAAQ;AAAA,UAAiC;AACzC,UAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,UAAA,IAAA,CAAK,cAAA,EAAe;AAAA,QACxB;AACA,QAAA,IAAA,CAAK,QAAA,CAAS,SAAS,KAAK,CAAA;AAC5B,QAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,QAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,MACzB,CAAA;AAAA,MACA,MAAM;AACF,QAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,MAC5B;AAAA,KACJ;AAAA,EACJ;AAAA;AAAA,EAGQ,eAAA,GAA+B;AACnC,IAAA,OAAQ,QAAA,CAAS,qBAA4C,QAAA,CAAS,IAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,wBAAA,GAAiC;AACrC,IAAA,MAAM,IAAA,GAAO,KAAK,eAAA,EAAgB;AAClC,IAAA,IAAA,CAAK,MAAA,EAAQ,eAAe,IAAI,CAAA;AAChC,IAAA,IAAA,CAAK,OAAA,EAAS,eAAe,IAAI,CAAA;AACjC,IAAA,MAAM,MAAA,GAAsC;AAAA,MACxC,KAAK,eAAA,EAAiB,EAAA;AAAA,MACtB,KAAK,uBAAA,EAAyB,EAAA;AAAA,MAC9B,KAAK,mBAAA,EAAqB,EAAA;AAAA,MAC1B,KAAK,eAAA,EAAiB;AAAA,KAC1B;AACA,IAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACrB,MAAA,IAAI,MAAM,EAAA,CAAG,aAAA,KAAkB,IAAA,EAAM,IAAA,CAAK,YAAY,EAAE,CAAA;AAAA,IAC5D;AAAA,EACJ;AAAA,EAEQ,kBAAA,GAA2B;AAC/B,IAAA,IAAA,CAAK,cAAA,GAAiB,CAAC,IAAA,CAAK,cAAA;AAC5B,IAAA,IAAA,CAAK,OAAA,EAAS,UAAA,CAAW,IAAA,CAAK,cAAc,CAAA;AAC5C,IAAA,IAAA,CAAK,MAAA,EAAQ,oBAAA,CAAqB,IAAA,CAAK,cAAc,CAAA;AAAA,EACzD;AAAA,EAEQ,oBAAoB,KAAA,EAAsB;AAC9C,IAAA,IAAA,CAAK,gBAAA,GAAmB,KAAA;AACxB,IAAA,IAAI,KAAA,EAAO;AACP,MAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO;AAAA,QAC9B,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,GAAA;AAAA,QACP,KAAA,EAAO,OAAA;AAAA,QACP,MAAA,EAAQ,OAAA;AAAA,QACR,MAAA,EAAQ;AAAA,OACX,CAAA;AAAA,IACL,CAAA,MAAO;AACH,MAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO;AAAA,QAC9B,QAAA,EAAU,EAAA;AAAA,QACV,KAAA,EAAO,EAAA;AAAA,QACP,KAAA,EAAO,EAAA;AAAA,QACP,MAAA,EAAQ,EAAA;AAAA,QACR,MAAA,EAAQ;AAAA,OACX,CAAA;AAAA,IACL;AACA,IAAA,IAAA,CAAK,MAAA,EAAQ,cAAc,KAAK,CAAA;AAChC,IAAA,IAAA,CAAK,wBAAA,EAAyB;AAC9B,IAAA,qBAAA,CAAsB,MAAM,IAAA,CAAK,QAAA,EAAU,CAAA;AAAA,EAC/C;AAAA,EAEQ,gBAAA,GAAyB;AAC7B,IAAA,MAAM,UAAA,GAAa,CAAC,CAAC,QAAA,CAAS,iBAAA;AAE9B,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,IAAA,CAAK,gBAAA,EAAkB;AAEvC,MAAA,IAAI,IAAA,CAAK,QAAQ,iBAAA,EAAmB;AAChC,QAAA,IAAA,CAAK,OAAA,CACA,iBAAA,EAAkB,CAClB,IAAA,CAAK,MAAM;AAER,UAAA,IAAA,CAAK,MAAA,EAAQ,cAAc,IAAI,CAAA;AAAA,QACnC,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AACT,UAAA,IAAA,CAAK,oBAAoB,IAAI,CAAA;AAAA,QACjC,CAAC,CAAA;AAAA,MACT,CAAA,MAAO;AAEH,QAAA,IAAA,CAAK,oBAAoB,IAAI,CAAA;AAAA,MACjC;AAAA,IACJ,WAAW,UAAA,EAAY;AACnB,MAAA,QAAA,CAAS,cAAA,EAAe,CAAE,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAAA,IAE5C,CAAA,MAAO;AAEH,MAAA,IAAA,CAAK,oBAAoB,KAAK,CAAA;AAAA,IAClC;AAAA,EACJ;AAAA,EAEQ,oBAAA,GAA6B;AACjC,IAAA,IAAI,IAAA,CAAK,gCAAgC,IAAA,EAAM;AAC3C,MAAA,IAAA,CAAK,sBAAsB,IAAA,CAAK,2BAAA;AAChC,MAAA;AAAA,IACJ;AACA,IAAA,MAAM,WAAA,GAAc,KAAK,MAAA,CAAO,MAAA;AAAA,MAC5B,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,UAAA,IAAc,EAAE,IAAA,KAAS;AAAA,KAC/C,CAAE,MAAA;AACF,IAAA,IAAA,CAAK,mBAAA,GACD,WAAA,GAAc,IAAA,CAAK,gCAAA,GAAmC,KAAA,GAAQ,MAAA;AAAA,EACtE;AAAA,EAEQ,gBAAA,GAAyB;AAC7B,IAAA,IAAI,KAAK,YAAA,EAAc;AACvB,IAAA,MAAM,GAAA,GAAM,OAAO,gBAAA,IAAoB,CAAA;AACvC,IAAA,MAAM,EAAE,QAAA,EAAU,GAAA,EAAK,aAAa,MAAA,EAAQ,KAAA,EAAO,UAAS,GAAI,IAAA;AAEhE,IAAA,GAAA,CAAI,UAAU,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AAE/C,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA,IAAK,IAAA,CAAK,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AAC5E,MAAA,IAAA,CAAK,qBAAqB,EAAC;AAC3B,MAAA,IAAA,CAAK,sBAAsB,EAAC;AAC5B,MAAA,IAAA,CAAK,kBAAkB,EAAC;AACxB,MAAA,IAAA,CAAK,uBAAuB,EAAC;AAC7B,MAAA,IAAA,CAAK,sBAAsB,EAAC;AAC5B,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,KAAK,cAAA,EAAe;AAC/C,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,oBAAA,IAAwB,IAAA,CAAK,oBAAoB,QAAQ,CAAA;AAIjF,IAAA,MAAM,aAAA,GAAgB,KAAK,MAAA,CAAO,MAAA;AAAA,MAC9B,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,SAAA,IAAc,EAAwB,OAAA,IAAW;AAAA,KACvE;AAEA,IAAA,MAAM,kBAAkB,IAAA,CAAK,MAAA,CACxB,MAAA,CAAO,CAAC,MAAM,EAAE,CAAA,CAAE,IAAA,KAAS,SAAA,IAAc,EAAwB,OAAA,IAAW,IAAA,CAAK,CAAA,CACjF,GAAA,CAAI,CAAC,CAAA,KAAM;AACR,MAAA,MAAM,eAAe,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAA,CAAE,KAAK,KAAK,EAAC;AAC7D,MAAA,MAAM,WAAW,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,UAAU,CAAA;AAChE,MAAA,MAAM,WAAW,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,YAAY,CAAA;AAClE,MAAA,MAAM,UAAU,QAAA,IAAY,CAAC,QAAA,CAAS,SAAA,GAAY,SAAS,QAAA,GAAW,MAAA;AACtE,MAAA,MAAM,UAAU,QAAA,IAAY,CAAC,QAAA,CAAS,SAAA,GAAY,SAAS,QAAA,GAAW,MAAA;AACtE,MAAA,MAAM,WAAA,GAAc,UAAU,SAAA,IAAa,KAAA;AAC3C,MAAA,MAAM,WAAA,GAAc,UAAU,SAAA,IAAa,KAAA;AAC3C,MAAA,MAAM,SAAA,GAAY,aAAa,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,MAAM,CAAA,EAAG,QAAA;AAEhE,MAAA,MAAM,MAAA,GAAS,cAAc,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAA,KAAY,EAAE,KAAK,CAAA;AAChE,MAAA,IACI,MAAA,CAAO,MAAA,KAAW,CAAA,IAClB,OAAA,KAAY,MAAA,IACZ,OAAA,KAAY,MAAA,IACZ,SAAA,KAAc,MAAA,IACd,CAAC,WAAA,IACD,CAAC,WAAA;AAED,QAAA,OAAO,CAAA;AAMX,MAAA,MAAM,KAAA,GAAQ,EAAE,GAAG,CAAA,EAAE;AAGrB,MAAA,IAAI,SAAA,KAAc,MAAA,EAAW,KAAA,CAAM,KAAA,GAAQ,SAAA;AAC3C,MAAA,IAAI,OAAA,KAAY,MAAA,EAAY,KAAA,CAAwB,aAAA,GAAgB,OAAA;AAAA,WAAA,IAC3D,WAAA,EAAc,KAAA,CAAwB,aAAA,GAAgB,MAAA;AAC/D,MAAA,IAAI,OAAA,KAAY,MAAA,EAAY,KAAA,CAAwB,eAAA,GAAkB,OAAA;AAAA,WAAA,IAC7D,WAAA,EAAc,KAAA,CAAwB,eAAA,GAAkB,MAAA;AAIjE,MAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACnB,QAAA,MAAM,UAAA,GAAc,EAAwC,IAAA,IAAQ,KAAA;AACpE,QAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACpB,UAAA,MAAM,IAAA,GAAO,eAAe,KAAA,GAAQ,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAA;AACpE,UAAA,IAAI,IAAA,EAAM;AACN,YAAA,KAAA,CAAM,gBAAgB,WAAA,GAAc,MAAA,GAAa,OAAA,IAAW,KAAA,CAAM,iBAAiB,CAAA,CAAE,KAAA;AACrF,YAAA,KAAA,CAAM,gBAAgB,CAAA,CAAE,KAAA;AAAA,UAC5B,CAAA,MAAO;AACH,YAAA,KAAA,CAAM,kBAAkB,WAAA,GAAc,MAAA,GAAa,OAAA,IAAW,KAAA,CAAM,mBAAmB,CAAA,CAAE,KAAA;AACzF,YAAA,KAAA,CAAM,gBAAgB,CAAA,CAAE,KAAA;AAAA,UAC5B;AAAA,QACJ;AAAA,MACJ;AAEA,MAAA,OAAO,KAAA;AAAA,IACX,CAAC,CAAA;AAEL,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,KAAA,CAAM,KAAK,GAAG,CAAA;AAClB,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,MAAA,EAAQ,MAAM,CAAA;AAC7B,IAAA,GAAA,CAAI,IAAA,EAAK;AAIT,IAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAClB,CAAA,CAAE,SAAS,UAAA,IAAc,CAAC,CAAE,CAAA,CAAoB,kBAAA;AAEpD,IAAA,MAAM,iBACF,IAAA,CAAK,kBAAA,KAAuB,OACtB,eAAA,CAAgB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,IAAA,CAAK,kBAAkB,IACjE,IAAA,CAAK,kBAAA,KAAuB,SAC1B,EAAC,GACD,KAAK,kBAAA,KAAuB,WAAA;AAAA;AAAA,MAE1B,eAAA,CAAgB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,UAAA,IAAc,CAAC,YAAA,CAAa,CAAC,CAAC;AAAA,QACvE,KAAK,kBAAA,KAAuB,QAAA;AAAA;AAAA,MAE1B,eAAA,CAAgB,OAAO,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,SAAA,IAAa,YAAA,CAAa,CAAC,CAAC;AAAA,QACrE,eAAA;AAEhB,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,sBAAA,GACxB,IAAA,CAAK,wBAAA,GACL,CAAA;AAEN,IAAA,MAAM,MAAA,GAAS,iBAAA;AAAA,MACX,GAAA;AAAA,MACA,cAAA;AAAA,MACA,IAAA,CAAK,YAAA;AAAA,MACL,UAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA,CAAK,UAAU,iBAAA,EAAkB;AAAA,MACjC,IAAA,CAAK,iBAAA;AAAA,MACL,IAAA,CAAK,kBAAkB,SAAA,IAAa,IAAA;AAAA,MACpC,IAAA,CAAK,iBAAA;AAAA,MACL,IAAA,CAAK,kBAAA;AAAA;AAAA;AAAA,0BAGD,GAAA,CAAI;AAAA,QACJ,GAAG,IAAA,CAAK,iBAAA,CAAkB,IAAA,EAAK;AAAA,QAC/B,GAAI,KAAK,cAAA,KAAmB,IAAA,GAAO,CAAC,IAAA,CAAK,cAAc,IAAI;AAAC,OAC/D,CAAA;AAAA,MACD,IAAA,CAAK,mBAAA;AAAA,MACL,IAAA,CAAK,sBAAA;AAAA,MACL,IAAA,CAAK,eAAA;AAAA,MACL,IAAA,CAAK,eAAA;AAAA,MACL,IAAA,CAAK,gBAAA;AAAA,MACL,gBAAA;AAAA,MACA,IAAA,CAAK,kBAAA;AAAA,MACL,IAAA,CAAK,mBAAA;AAAA,MACL,IAAA,CAAK,mBAAA;AAAA,MACL,IAAA,CAAK,qBAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACT;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAIZ,IAAA,MAAM,WAAA,GAAc,2BAAA;AAAA,MAChB,GAAA;AAAA,MACA,cAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA,CAAK,kBAAkB,SAAA,IAAa,IAAA;AAAA,MACpC,IAAA,CAAK;AAAA,KACT;AACA,IAAA,IAAA,CAAK,sBAAsB,WAAA,CAAY,QAAA;AAEvC,IAAA,sBAAA;AAAA,MACI,GAAA;AAAA,MACA,cAAA;AAAA,MACA,IAAA,CAAK,YAAA;AAAA,MACL,UAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA,CAAK,UAAU,iBAAA;AAAkB,KACrC;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAEZ,IAAA,IAAA,CAAK,qBAAqB,MAAA,CAAO,QAAA;AACjC,IAAA,IAAA,CAAK,sBAAsB,MAAA,CAAO,SAAA;AAClC,IAAA,IAAA,CAAK,kBAAkB,MAAA,CAAO,UAAA;AAC9B,IAAA,IAAA,CAAK,sBAAsB,MAAA,CAAO,SAAA;AAClC,IAAA,IAAA,CAAK,yBAAyB,MAAA,CAAO,YAAA;AACrC,IAAA,IAAA,CAAK,uBAAuB,MAAA,CAAO,eAAA;AACnC,IAAA,IAAA,CAAK,oBAAoB,MAAA,CAAO,iBAAA;AAChC,IAAA,IAAA,CAAK,eAAe,MAAA,CAAO,QAAA;AAC3B,IAAA,IAAA,CAAK,oBAAoB,MAAA,CAAO,gBAAA;AAGhC,IAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,IAAA,GAAO,CAAA,EAAG;AAChC,MAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,MAAA,CAAO,QAAA,CAAS,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAC3D,MAAA,KAAA,MAAW,EAAA,IAAM,KAAK,gBAAA,EAAkB;AACpC,QAAA,IAAI,CAAC,WAAW,GAAA,CAAI,EAAE,GAAG,IAAA,CAAK,gBAAA,CAAiB,OAAO,EAAE,CAAA;AAAA,MAC5D;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA,EAKQ,oBAAA,CAAqB,OAAe,QAAA,EAA0B;AAClE,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA;AAChD,IAAA,OAAO,OAAA,EAAS,KAAK,CAAC,CAAA,KAAM,EAAE,KAAA,KAAU,MAAM,GAAG,QAAA,IAAY,QAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,sBAAA,CACJ,KAAA,EACA,YAAA,EACA,QAAA,EACkB;AAClB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA;AAChD,IAAA,MAAM,MAAA,GAAS,SAAS,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,YAAY,CAAA,EAAG,QAAA;AAC/D,IAAA,OAAO,MAAA,IAAU,QAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,sBAAsB,KAAA,EAK5B;AACE,IAAA,IAAI,UAAW,KAAA,CAA4C,aAAA;AAC3D,IAAA,IAAI,UAAW,KAAA,CAA4C,eAAA;AAC3D,IAAA,IAAI,cAAA;AACJ,IAAA,IAAI,cAAA;AACJ,IAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,MAAA,EAAW;AAChD,MAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,MAAA;AAAA,QACzB,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,SAAA,IAAc,CAAA,CAAwB,YAAY,KAAA,CAAM;AAAA,OAC9E;AACA,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACrB,QAAA,MAAM,IAAA,GAAQ,MAA4B,IAAA,IAAQ,KAAA;AAClD,QAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AACxB,UAAA,MAAM,IAAA,GAAO,SAAS,KAAA,GAAQ,GAAA,CAAI,QAAQ,KAAA,CAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,GAAQ,KAAA,CAAM,KAAA;AAC1E,UAAA,IAAI,IAAA,IAAQ,YAAY,MAAA,EAAW;AAC/B,YAAA,OAAA,GAAU,GAAA,CAAI,KAAA;AACd,YAAA,cAAA,GAAiB,GAAA,CAAI,KAAA;AAAA,UACzB,CAAA,MAAA,IAAW,CAAC,IAAA,IAAQ,OAAA,KAAY,MAAA,EAAW;AACvC,YAAA,OAAA,GAAU,GAAA,CAAI,KAAA;AACd,YAAA,cAAA,GAAiB,GAAA,CAAI,KAAA;AAAA,UACzB;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AACA,IAAA,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,cAAA,EAAgB,cAAA,EAAe;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,6BAAA,CACJ,QACA,iBAAA,EACI;AACJ,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,MAAA,CAAO,KAAK,CAAA;AAE9D,IAAA,MAAM,OAAA,GACF,OAAO,cAAA,KAAmB,MAAA,IAC1B,OAAO,YAAA,KAAiB,MAAA,IACxB,MAAA,CAAO,cAAA,KAAmB,MAAA,CAAO,YAAA;AACrC,IAAA,MAAM,OAAA,GACF,OAAO,cAAA,KAAmB,MAAA,IAC1B,OAAO,YAAA,KAAiB,MAAA,IACxB,MAAA,CAAO,cAAA,KAAmB,MAAA,CAAO,YAAA;AAGrC,IAAA,MAAM,UAAA,GAAa,CAAC,OAAA,IAAW,CAAC,OAAA;AAChC,IAAA,IAAA,CAAK,kBAAA;AAAA,MACD,MAAA;AAAA,MACA,MAAA,CAAO,UAAA;AAAA,MACP,iBAAA;AAAA;AAAA,MACoB,CAAC;AAAA,KACzB;AAKA,IAAA,MAAM,eAAe,IAAA,CAAK,iBAAA,CACrB,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA,EACf,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,KAAA,KAAU,MAAA,IAAU,CAAA,CAAE,QAAA,KAAa,OAAO,QAAQ,CAAA;AACtE,IAAA,IAAI,CAAC,YAAA,EAAc;AACf,MAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAC3B,MAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAC3B,MAAA;AAAA,IACJ;AAEA,IAAA,IAAI,OAAA,EAAS;AACT,MAAA,MAAM,WAAW,CAAC,OAAA;AAClB,MAAA,MAAM,QAAA,GAAW,KAAA;AACjB,MAAA,MAAM,YAAA,GAAe,KAAA;AACrB,MAAA,MAAM,MAAA,GACD,QAAA,EAAU,YAAA,IAAgB,YAAA,EAAc,gBAAiB,MAAA,CAAO,IAAA;AACrE,MAAA,IAAA,CAAK,kBAAA;AAAA,QACD;AAAA,UACI,OAAa,MAAA,CAAO,KAAA;AAAA,UACpB,MAAa,MAAA,CAAO,IAAA;AAAA,UACpB,UAAa,MAAA,CAAO,cAAA;AAAA,UACpB,IAAA,EAAa,MAAA;AAAA,UACb,WAAA,EAAa;AAAA,SACjB;AAAA,QACA,MAAA,CAAO,YAAA;AAAA,QACP,KAAK,oBAAA,IAAwB,iBAAA;AAAA;AAAA,QACT,CAAC;AAAA,OACzB;AAAA,IACJ;AAEA,IAAA,IAAI,OAAA,EAAS;AACT,MAAA,MAAM,QAAA,GAAW,KAAA;AACjB,MAAA,MAAM,YAAA,GAAe,KAAA;AACrB,MAAA,MAAM,MAAA,GACD,QAAA,EAAU,cAAA,IAAkB,YAAA,EAAc,kBAAmB,MAAA,CAAO,IAAA;AACzE,MAAA,IAAA,CAAK,kBAAA;AAAA,QACD;AAAA,UACI,OAAa,MAAA,CAAO,KAAA;AAAA,UACpB,MAAa,MAAA,CAAO,IAAA;AAAA,UACpB,UAAa,MAAA,CAAO,cAAA;AAAA,UACpB,IAAA,EAAa,MAAA;AAAA,UACb,WAAA,EAAa;AAAA,SACjB;AAAA,QACA,MAAA,CAAO,YAAA;AAAA,QACP,KAAK,oBAAA,IAAwB,iBAAA;AAAA;AAAA,QACT;AAAA;AAAA,OACxB;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAC3B,IAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAC3B,IAAA,IAAA,CAAK,oBAAA,GAAuB,IAAA;AAC5B,IAAA,IAAA,CAAK,oBAAA,GAAuB,IAAA;AAAA,EAChC;AAAA,EAEQ,kBAAA,CACJ,MAAA,EAOA,QAAA,EACA,iBAAA,EAIA,gBAAyB,KAAA,EACrB;AAEJ,IAAA,IAAI,OAAO,WAAA,EAAa;AACpB,MAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,MAAA,CAAO,KAAK,CAAA;AAQ9D,MAAA,MAAM,UAAA,GAAa,OAAO,IAAA,IAAQ,KAAA;AAClC,MAAA,MAAM,cAAc,IAAA,CAAK,oBAAA,CAAqB,OAAO,KAAA,EAAO,KAAA,EAAO,SAAS,QAAQ,CAAA;AACpF,MAAA,MAAM,YAAA,GAAe,OAAO,kBAAA,KAAuB,IAAA;AACnD,MAAA,MAAM,OAAA,GAAW,KAAA,EAAO,IAAA,EAA6C,QAAA,KAAa,IAAA;AAGlF,MAAA,MAAM,uBACF,IAAA,CAAK,sBAAA,IAA0B,MAAA,CAAO,IAAA,KAAS,aAAa,CAAC,OAAA;AACjE,MAAA,MAAM,GAAA,GAAM,KAAK,SAAA,CAAU,GAAA;AAC3B,MAAA,MAAM,WAAA,GACF,YAAA,IAAgB,OAAA,IAAW,oBAAA,GACrB,CAAA,GACC,IAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,EAAG,KAAA,IAAS,CAAA;AACzC,MAAA,IACI,CAAC,gBAAA,CAAiB,mBAAA;AAAA,QACd,MAAA,CAAO,QAAA;AAAA,QACP,MAAA,CAAO,WAAA;AAAA,QACP,WAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACJ,EACF;AACE,QAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,QAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,QAAA;AAAA,MACJ;AAAA,IACJ;AAGA,IAAA,IAAI,CAAC,OAAO,WAAA,EAAa;AACrB,MAAA,MAAM,UAAA,GAAa,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,MAAA,CAAO,KAAK,CAAA;AAGnE,MAAA,IAAI,UAAA,EAAY,SAAA,IAAa,UAAA,EAAY,IAAA,EAAM;AAC3C,QAAA,MAAM,OAAA,GAAU,KAAK,SAAA,CAAU,GAAA;AAC/B,QAAA,MAAM,WAAW,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,GAAG,KAAA,IAAS,CAAA;AACvD,QAAA,IAAI,WAAW,CAAA,EAAG;AACd,UAAA,MAAM,iBAAA,GACD,UAAA,CAAW,IAAA,KAAS,KAAA,IAAS,UAAA,CAAW,SAAA,KAAc,OAAA,IACtD,UAAA,CAAW,IAAA,KAAS,MAAA,IAAU,UAAA,CAAW,SAAA,KAAc,MAAA;AAC5D,UAAA,MAAM,QAAQ,iBAAA,GACR,MAAA,CAAO,QAAA,GAAW,QAAA,GAClB,OAAO,QAAA,GAAW,QAAA;AACxB,UAAA,IAAI,CAAC,KAAA,EAAO;AACR,YAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,YAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,YAAA;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAOA,IAAA,IAAI,MAAA,CAAO,aAAa,QAAA,EAAU;AAC9B,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,MAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,MAAA;AAAA,IACJ;AAGA,IAAA,MAAM,KAAA,GAA4C,OAAO,WAAA,IAAe,MAAA;AACxE,IAAA,MAAM,QAAQ,IAAA,CAAK,aAAA;AACnB,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AAGrB,IAAA,MAAM,YAAA,GAAe,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,MAAA,CAAO,KAAK,CAAA;AAGrE,IAAA,MAAM,gBACF,YAAA,EAAc,SAAA,KAAc,QAAA,IAC3B,YAAA,EAAc,MAA6C,QAAA,KAAa,IAAA;AAC7E,IAAA,IAAI,aAAA,EAAe;AACf,MAAA,IAAI,UAAU,MAAA,EAAQ;AAClB,QAAA,IAAA,CAAK,wBAAwB,KAAA,KAAU,UAAA,GAAa,IAAA,GAAO,IAAA,EAAM,OAAO,QAAQ,CAAA;AAChF,QAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,gBAAA,EAAkB;AAAA,UAChC,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,MAAM,YAAA,EAAc,IAAA;AAAA,UACpB,WAAA,EAAa,KAAA;AAAA,UACb,cAAc,IAAA,CAAK;AAAA,SACtB,CAAA;AAAA,MACL;AACA,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,MAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,MAAA;AAAA,IACJ;AAIA,IAAA,MAAM,mBACF,YAAA,KAAiB,MAAA,IACjB,UAAU,MAAA,IACT,YAAA,EAAc,MAA6C,QAAA,KAAa,IAAA;AAC7E,IAAA,IAAI,gBAAA,EAAkB;AAClB,MAAA,IAAA,CAAK,wBAAwB,KAAA,KAAU,UAAA,GAAa,IAAA,GAAO,IAAA,EAAM,OAAO,QAAQ,CAAA;AAChF,MAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,gBAAA,EAAkB;AAAA,QAChC,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,MAAM,YAAA,EAAc,IAAA;AAAA,QACpB,WAAA,EAAa,KAAA;AAAA,QACb,cAAc,IAAA,CAAK;AAAA,OACtB,CAAA;AACD,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,MAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,MAAA;AAAA,IACJ;AAGA,IAAA,MAAM,0BAAA,GACF,YAAA,KAAiB,MAAA,IACjB,KAAA,KAAU,MAAA,IACT,YAAA,EAAc,IAAA,EAA6C,QAAA,KAAa,IAAA,IACxE,YAAA,CAAmC,SAAA,KAAc,QAAA,IAClD,IAAA,CAAK,sBAAA;AACT,IAAA,IAAI,0BAAA,EAA4B;AAC5B,MAAA,IAAA,CAAK,qBAAA,CAAsB,OAAO,QAAQ,CAAA;AAC1C,MAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,gBAAA,EAAkB;AAAA,QAChC,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,MAAM,YAAA,EAAc,IAAA;AAAA,QACpB,WAAA,EAAa,MAAA;AAAA,QACb,cAAc,IAAA,CAAK;AAAA,OACtB,CAAA;AACD,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,MAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,WAAW,IAAA,CAAK,iBAAA,CAAkB,IAAI,MAAA,CAAO,KAAK,KAAK,EAAC;AAC9D,IAAA,MAAM,WAAW,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AACzD,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,QAAA,EAAU,OAAO,QAAA,EAAU,QAAA,EAAU,KAAA,EAAO,iBAAA,EAAmB,CAAA;AACtF,IAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,MAAA,CAAO,KAAA,EAAO,QAAQ,CAAA;AAEjD,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAKzB,IAAA,IAAI,IAAA,CAAK,sBAAA,IAA0B,CAAC,aAAA,EAAe;AAC/C,MAAA,IAAA,CAAK,mBAAA,CAAoB,OAAO,KAAK,CAAA;AACrC,MAAA;AAAA,IACJ;AAEA,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,EAC1B;AAAA,EAEQ,kBAAA,CACJ,MACA,KAAA,EACgB;AAChB,IAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU,GAAA;AAC5B,IAAA,MAAM,SAAA,GAAY,KAAK,MAAA,GAAS,CAAA,GAAI,KAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,CAAE,KAAA,GAAQ,KAAA;AAClE,IAAA,IAAI,IAAA,KAAS,KAAA,EAAO,OAAO,KAAA,GAAQ,YAAY,OAAA,GAAU,MAAA;AACzD,IAAA,OAAO,KAAA,GAAQ,YAAY,OAAA,GAAU,MAAA;AAAA,EACzC;AAAA,EAEQ,gBAAA,CACJ,IAAA,EACA,KAAA,EACA,SAAA,EACI;AACJ,IAAA,IAAI,KAAK,eAAA,EAAiB;AAC1B,IAAA,MAAM,KAAA,GAAQ,CAAA,QAAA,EAAW,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AACnC,IAAA,MAAM,UAAA,GAAgC;AAAA,MAClC,IAAA,EAAM,SAAA;AAAA,MACN,KAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAM,IAAA,CAAK,YAAA;AAAA,MACX,IAAA,EAAM,EAAE,QAAA,EAAU,IAAA;AAAK,KAC3B;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,CAAC,GAAG,IAAA,CAAK,QAAQ,UAAU,CAAA;AACzC,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAA;AAE1B,IAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,KAAA,EAAO,CAAC,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,CAAC,CAAA;AACvF,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,gBAAA,EAAkB;AAAA,MAChC,IAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA;AAAA,MACA,cAAc,IAAA,CAAK;AAAA,KACtB,CAAA;AAAA,EACL;AAAA,EAEQ,gBAAA,GAAyB;AAC7B,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AAC3B,IAAA,MAAM,QAAQ,IAAA,CAAK,eAAA;AACnB,IAAA,IAAA,CAAK,MAAA,GAAS,KAAK,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AACzD,IAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,KAAK,CAAA;AACnC,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,IAAA,CAAK,kBAAkB,EAAC;AACxB,IAAA,IAAA,CAAK,iBAAiB,IAAA,EAAK;AAC3B,IAAA,IAAA,CAAK,iBAAA,GAAoB,MAAA;AACzB,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,gBAAA,EAAkB,EAAE,OAAO,YAAA,EAAc,IAAA,CAAK,cAAc,CAAA;AAAA,EAClF;AAAA,EAEQ,oBAAoB,KAAA,EAAqB;AAC7C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA;AAChD,IAAA,IAAI,CAAC,OAAA,EAAS;AAIV,MAAA,IAAI,IAAA,CAAK,mBAAmB,KAAA,EAAO;AAC/B,QAAA,MAAMC,MAAAA,GAAQ,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AACvD,QAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,QAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,QAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,QAAA,IAAIA,MAAAA,EAAO;AACP,UAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,qBAAA,EAAuB;AAAA,YACrC,KAAA;AAAA,YACA,MAAMA,MAAAA,CAAM,IAAA;AAAA,YACZ,cAAc,IAAA,CAAK;AAAA,WACtB,CAAA;AAAA,QACL;AAAA,MACJ;AACA,MAAA;AAAA,IACJ;AACA,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AACvD,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,IAAI,IAAA,CAAK,cAAA,KAAmB,KAAA,EAAO,IAAA,CAAK,cAAA,GAAiB,IAAA;AAGzD,IAAA,IAAI,KAAA,KAAU,KAAK,eAAA,EAAiB;AAChC,MAAA,MAAM,YAAY,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,MAAM,CAAA;AACxD,MAAA,MAAM,KAAA,GAAQ,KAAA;AACd,MAAA,IAAA,CAAK,cAAA,GAAiB;AAAA,QAClB,KAAA,EAAO,SAAA,EAAW,QAAA,IAAY,KAAA,CAAM,KAAA;AAAA,QACpC,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,IAAA,CAAK,YAAA;AAAA,QACzB,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,GAAI,MAAM,aAAA,KAAkB,MAAA,GAAY,EAAE,QAAA,EAAU,KAAA,CAAM,aAAA,EAAc,GAAI,EAAC;AAAA,QAC7E,GAAI,MAAM,eAAA,KAAoB,MAAA,GAAY,EAAE,UAAA,EAAY,KAAA,CAAM,eAAA,EAAgB,GAAI;AAAC,OACtF,CAAA;AACD,MAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,qBAAA,EAAuB;AAAA,QACrC,KAAA;AAAA,QACA,IAAA,EAAM,OAAA;AAAA,QACN,cAAc,IAAA,CAAK;AAAA,OACtB,CAAA;AACD,MAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,MAAA;AAAA,IACJ;AAGA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA;AAChD,IAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,KAAK,CAAA;AACnC,IAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,KAAK,CAAA;AAIpC,IAAA,MAAM,aAAsB,OAAA,KAAY,MAAA,IAAa,KAAA,CAAM,IAAA,IAAQ,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,GACnF,EAAE,GAAI,KAAA,CAAM,IAAA,EAAkC,IAAA,EAAM,OAAA,KACpD,KAAA,CAAM,IAAA;AACZ,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,gBAAA,EAAkB;AAAA,MAChC,KAAA;AAAA,MACA,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,IAAA,EAAM,UAAA;AAAA,MACN,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,GAAI,OAAA,KAAY,MAAA,GAAY,EAAE,OAAA,KAAY,EAAC;AAAA,MAC3C,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM;AAExB,QAAA,MAAM,MAAM,KAAA,CAAM,IAAA;AAGlB,QAAA,IAAI,UAAA,GAAsB,UAAA;AAC1B,QAAA,IAAI,CAAA,CAAE,UAAU,UAAA,EAAY;AACxB,UAAA,UAAA,GAAa,GAAA,CAAI,gBAAgB,KAAA,CAAM,IAAA;AAAA,QAC3C,CAAA,MAAA,IAAW,CAAA,CAAE,KAAA,KAAU,YAAA,EAAc;AACjC,UAAA,UAAA,GAAa,GAAA,CAAI,kBAAkB,KAAA,CAAM,IAAA;AAAA,QAC7C;AACA,QAAA,IAAI,EAAE,iBAAA,EAAmB;AACrB,UAAA,MAAM,YAAA,GAAe,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,CAAA,CAAE,iBAAiB,CAAA;AAC5E,UAAA,IAAI,YAAA,eAA2B,YAAA,CAAa,IAAA;AAAA,QAChD;AAEA,QAAA,IAAI,SAAA;AAQJ,QAAA,IAAI,CAAA,CAAE,KAAA,KAAU,MAAA,EAAQ,SAAA,GAAY,MAAA;AAAA,aAAA,IAC3B,EAAE,KAAA,KAAU,UAAA;AACjB,UAAA,SAAA,GAAY,CAAA,CAAE,SAAA,GAAY,WAAA,GAAc,CAAA,CAAE,QAAQ,QAAA,GAAW,IAAA;AAAA,yBAChD,CAAA,CAAE,SAAA,GAAY,WAAA,GAAc,CAAA,CAAE,QAAQ,QAAA,GAAW,IAAA;AAElE,QAAA,OAAO;AAAA,UACH,KAAA,EAAO,SAAA;AAAA,UACP,UAAU,CAAA,CAAE,QAAA;AAAA,UACZ,IAAA,EAAM,UAAA;AAAA,UACN,GAAI,cAAc,MAAA,IAAU,OAAA,KAAY,SAAY,EAAE,OAAA,KAAY,EAAC;AAAA,UACnE,mBAAmB,CAAA,CAAE;AAAA,SACzB;AAAA,MACJ,CAAC;AAAA,KACJ,CAAA;AAED,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,qBAAA,EAAuB;AAAA,MACrC,KAAA;AAAA,MACA,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,cAAc,IAAA,CAAK;AAAA,KACtB,CAAA;AACD,IAAA,IAAI,KAAK,sBAAA,EAAwB,CAGjC,MAAO;AACH,MAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,KAAK,CAAA;AACnC,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,MAAA,IAAA,CAAK,kBAAkB,EAAC;AAAA,IAC5B;AACA,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,EAC1B;AAAA,EAEQ,qBAAqB,KAAA,EAAsB;AAE/C,IAAA,IAAI,KAAA,IAAS,KAAA,KAAU,IAAA,CAAK,eAAA,EAAiB;AACzC,MAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,MAAA;AAAA,IACJ;AAEA,IAAA,IAAI,CAAC,KAAA,IAAS,IAAA,CAAK,eAAA,EAAiB;AAChC,MAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,IAC1B;AAIA,IAAA,IAAI,KAAA,IAAS,CAAC,IAAA,CAAK,iBAAA,CAAkB,IAAI,KAAK,CAAA,IAAK,IAAA,CAAK,cAAA,KAAmB,KAAA,EAAO;AAC9E,MAAA,IAAA,CAAK,uBAAuB,KAAK,CAAA;AACjC,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,QAAA,GAUF,KAAA,GACE,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,GAC5B,CAAC,CAAC,KAAA,EAAO,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA,IAAK,EAAE,CAAC,CAAA,GACjD,EAAC,GACL,CAAC,GAAG,IAAA,CAAK,iBAAA,CAAkB,OAAA,EAAS,CAAA;AAE1C,IAAA,KAAA,MAAW,CAAC,GAAG,CAAA,IAAK,QAAA,EAAU;AAC1B,MAAA,IAAA,CAAK,0BAA0B,GAAG,CAAA;AAClC,MAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,GAAG,CAAA;AAEjC,MAAA,IAAI,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,GAAG,CAAA,EAAG;AACjC,QAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,GAAG,CAAA;AACjC,QAAA,MAAM,GAAA,GAAM,KAAK,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,GAAG,CAAA;AACxD,QAAA,IAAI,QAAQ,EAAA,IAAM,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,GAAG,CAAA,EAAG;AAChD,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,GAAG,CAAA;AAC5C,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAC3B,UAAA,IAAA,CAAK,MAAA,GAAS;AAAA,YACV,GAAG,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,GAAG,GAAG,CAAA;AAAA,YAC3B,EAAE,GAAG,GAAA,EAAK,IAAA,EAAM,IAAA,EAAK;AAAA,YACrB,GAAG,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,MAAM,CAAC;AAAA,WAChC;AAAA,QACJ;AACA,QAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,GAAG,CAAA;AAAA,MACtC;AACA,MAAA,MAAM,WAAA,GAAc,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,GAAG,CAAA;AAC3D,MAAA,IAAI,WAAA,EAAa;AACb,QAAA,IAAI,IAAA,CAAK,cAAA,KAAmB,GAAA,EAAK,IAAA,CAAK,cAAA,GAAiB,IAAA;AACvD,QAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,yBAAA,EAA2B;AAAA,UACzC,KAAA,EAAO,GAAA;AAAA,UACP,MAAM,WAAA,CAAY,IAAA;AAAA,UAClB,cAAc,IAAA,CAAK;AAAA,SACtB,CAAA;AAAA,MACL;AAAA,IACJ;AACA,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,IAAA,IAAA,CAAK,kBAAkB,EAAC;AACxB,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,0BAA0B,KAAA,EAAqB;AACnD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,KAAK,CAAA;AAChD,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,UAAA,IAAc,CAAA,CAAE,KAAK,CAAA;AACrE,IAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,YAAA,IAAgB,CAAA,CAAE,KAAK,CAAA;AACvE,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,EAAS;AAC1B,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AACjC,MAAA,IAAI,CAAA,CAAE,KAAA,KAAU,KAAA,EAAO,OAAO,CAAA;AAC9B,MAAA,MAAM,IAAA,GAAO,EAAE,GAAG,CAAA,EAAE;AACpB,MAAA,IAAI,OAAA,OAAc,aAAA,GAAgB,MAAA;AAClC,MAAA,IAAI,OAAA,OAAc,eAAA,GAAkB,MAAA;AACpC,MAAA,OAAO,IAAA;AAAA,IACX,CAAC,CAAA;AAAA,EACL;AAAA,EAEQ,MAAA,GAAe;AACnB,IAAA,IAAI,KAAK,YAAA,EAAc;AACvB,IAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,UAAS,GAAI,IAAA;AACzC,IAAA,MAAM,GAAA,GAAM,OAAO,gBAAA,IAAoB,CAAA;AACvC,IAAA,MAAM,SAAS,MAAA,CAAO,KAAA;AACtB,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AAEtB,IAAA,MAAM,MAAA,GAAS,MAAA,GAAS,GAAA,GAAM,IAAA,CAAK,cAAA;AAGnC,IAAA,MAAM,gBAAA,GAAmB,KAAK,gBAAA,CAAiB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,CAAU,IAAA,KAAS,KAAK,CAAA;AACvF,IAAA,MAAM,WAAW,gBAAA,CAAiB,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AACxD,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,MAAA,CAAO,CAAC,GAAA,EAAK,GAAA,KAAQ,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,GAAI,cAAA,EAAgB,CAAC,CAAA;AAEzF,IAAA,MAAM,MAAA,GAAS,MAAA,GAAS,GAAA,GAAM,IAAA,CAAK,cAAA,GAAiB,SAAA;AAEpD,IAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,MAAA,EAAQ,MAAM,CAAA;AAClC,IAAA,GAAA,CAAI,YAAY,KAAA,CAAM,UAAA;AACtB,IAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,MAAA,EAAQ,MAAM,CAAA;AAEjC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,QAAQ,CAAA;AAC/C,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACnB,MAAA,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA,EAAG,CAAA,EAAG,KAAK,UAAA,CAAW,KAAA,EAAO,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AAC1E,MAAA;AAAA,IACJ;AAGA,IAAA;AAEI,MAAA,IAAI,KAAK,UAAA,EAAY;AACjB,QAAA,IAAA,CAAK,QAAA,GAAW,EAAE,GAAG,IAAA,CAAK,eAAA,EAAgB;AAAA,MAC9C,CAAA,MAAO;AACH,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,UAAA,GAAa,KAAK,QAAA,CAAS,UAAA;AAC/D,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,eAAA,CAAgB,QAAA,GAAW,KAAK,QAAA,CAAS,QAAA;AAC3D,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,eAAA,CAAgB,QAAA,GAAW,KAAK,eAAA,CAAgB,UAAA;AACzE,QAAA,MAAM,UAAU,WAAA,GAAc,IAAA;AAC9B,QAAA,IAAI,IAAA,CAAK,IAAI,MAAM,CAAA,GAAI,WAAW,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,GAAI,OAAA,EAAS;AACxD,UAAA,IAAA,CAAK,QAAA,GAAW,EAAE,GAAG,IAAA,CAAK,eAAA,EAAgB;AAAA,QAC9C,CAAA,MAAO;AACH,UAAA,IAAA,CAAK,QAAA,GAAW;AAAA,YACZ,GAAG,IAAA,CAAK,QAAA;AAAA,YACR,UAAA,EAAY,IAAA,CAAK,QAAA,CAAS,UAAA,GAAa,MAAA,GAAS,aAAA;AAAA,YAChD,QAAA,EAAU,IAAA,CAAK,QAAA,CAAS,QAAA,GAAW,IAAA,GAAO,aAAA;AAAA,YAC1C,WAAA,EAAa,KAAK,eAAA,CAAgB,WAAA;AAAA,YAClC,SAAA,EAAW,KAAK,eAAA,CAAgB;AAAA,WACpC;AACA,UAAA,IAAA,CAAK,cAAA,EAAe;AAAA,QACxB;AAAA,MACJ;AAAA,IACJ;AAEA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,gBAAA,KAAqB,CAAA,IAAO,KAAK,cAAA,KAAmB,CAAA;AAE9E,IAAA,IAAI,CAAC,YAAA,EAAc;AAEf,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,mBAAA,CAAoB,QAAQ,CAAA;AACrD,MAAA,IAAI,CAAC,KAAK,oBAAA,EAAsB;AAC5B,QAAA,IAAA,CAAK,oBAAA,GAAuB,WAAA;AAAA,MAChC,CAAA,MAAO;AACH,QAAA,MAAM,OAAA,GAAA,CAAW,WAAA,CAAY,GAAA,GAAM,WAAA,CAAY,GAAA,IAAO,IAAA;AACtD,QAAA,MAAM,IAAA,GAAO,WAAA,CAAY,GAAA,GAAM,IAAA,CAAK,oBAAA,CAAqB,GAAA;AACzD,QAAA,MAAM,IAAA,GAAO,WAAA,CAAY,GAAA,GAAM,IAAA,CAAK,oBAAA,CAAqB,GAAA;AACzD,QAAA,IAAI,IAAA,CAAK,IAAI,IAAI,CAAA,GAAI,WAAW,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,GAAI,OAAA,EAAS;AACtD,UAAA,IAAA,CAAK,oBAAA,GAAuB,WAAA;AAAA,QAChC,CAAA,MAAO;AACH,UAAA,IAAA,CAAK,oBAAA,GAAuB;AAAA,YACxB,GAAA,EAAK,IAAA,CAAK,oBAAA,CAAqB,GAAA,GAAM,IAAA,GAAO,gBAAA;AAAA,YAC5C,GAAA,EAAK,IAAA,CAAK,oBAAA,CAAqB,GAAA,GAAM,IAAA,GAAO;AAAA,WAChD;AACA,UAAA,IAAA,CAAK,cAAA,EAAe;AAAA,QACxB;AAAA,MACJ;AAAA,IACJ,CAAA,MAAO;AAGH,MAAA,IAAI,CAAC,KAAK,kBAAA,EAAoB;AAC1B,QAAA,IAAA,CAAK,qBACD,IAAA,CAAK,oBAAA,IAAwB,IAAA,CAAK,SAAA,CAAU,cAAc,QAAQ,CAAA;AAAA,MAC1E;AACA,MAAA,MAAM,OAAO,IAAA,CAAK,kBAAA;AAClB,MAAA,MAAM,OAAO,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,GAAA,IAAO,IAAI,IAAA,CAAK,cAAA;AAC7C,MAAA,MAAM,QAAA,GAAW,KAAK,GAAA,KAAQ,IAAA,CAAK,OAAO,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,GAAA,IAAO,CAAA,GAAI,CAAA;AACrE,MAAA,IAAA,CAAK,oBAAA,GAAuB;AAAA,QACxB,GAAA,EAAK,GAAA,GAAM,QAAA,GAAW,IAAA,CAAK,gBAAA;AAAA,QAC3B,GAAA,EAAK,GAAA,GAAM,QAAA,GAAW,IAAA,CAAK;AAAA,OAC/B;AAAA,IACJ;AACA,IAAA,MAAM,aAAa,IAAA,CAAK,oBAAA;AACxB,IAAA,MAAM,WAAW,IAAA,CAAK,UAAA,GAAa,KAAK,SAAA,CAAU,cAAA,CAAe,QAAQ,CAAA,GAAI,IAAA;AAG7E,IAAA,MAAM,MAAA,GAAS,MAAA;AACf,IAAA,MAAA,CAAO,WAAA,GAAc,UAAA;AACrB,IAAA,MAAA,CAAO,WAAA,GAAc,MAAA;AAErB,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,KAAA,CAAM,KAAK,GAAG,CAAA;AAKlB,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,MAAA,EAAQ,MAAM,CAAA;AAC7B,IAAA,GAAA,CAAI,IAAA,EAAK;AAET,IAAA,UAAA,CAAW,KAAK,UAAA,EAAY,IAAA,CAAK,YAAA,EAAc,KAAA,EAAO,QAAQ,MAAM,CAAA;AAEpE,IAAA,QAAQ,KAAK,MAAA;AAAQ,MACjB,KAAK,aAAA;AACD,QAAA,iBAAA;AAAA,UACI,GAAA;AAAA,UACA,IAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAA;AAAA,UACA,IAAA,CAAK,YAAA;AAAA,UACL,KAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACJ;AACA,QAAA;AAAA,MACJ,KAAK,QAAA;AACD,QAAA,kBAAA;AAAA,UACI,GAAA;AAAA,UACA,IAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAA;AAAA,UACA,IAAA,CAAK,YAAA;AAAA,UACL,KAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACJ;AACA,QAAA;AAAA,MACJ,KAAK,MAAA;AACD,QAAA,UAAA;AAAA,UACI,GAAA;AAAA,UACA,IAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAA;AAAA,UACA,IAAA,CAAK,YAAA;AAAA,UACL,KAAA;AAAA,UACA,MAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACJ;AACA,QAAA;AAAA,MACJ,KAAK,MAAA;AACD,QAAA,UAAA;AAAA,UACI,GAAA;AAAA,UACA,IAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAA;AAAA,UACA,IAAA,CAAK,YAAA;AAAA,UACL,KAAA;AAAA,UACA,MAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACJ;AACA,QAAA;AAAA,MACJ,KAAK,MAAA;AACD,QAAA,UAAA;AAAA,UACI,GAAA;AAAA,UACA,IAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAA;AAAA,UACA,IAAA,CAAK,YAAA;AAAA,UACL,KAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACJ;AACA,QAAA;AAAA,MACJ,KAAK,YAAA;AACD,QAAA,gBAAA;AAAA,UACI,GAAA;AAAA,UACA,IAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAA;AAAA,UACA,IAAA,CAAK,YAAA;AAAA,UACL,KAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACJ;AACA,QAAA;AAAA,MACJ,KAAK,eAAA;AACD,QAAA,mBAAA;AAAA,UACI,GAAA;AAAA,UACA,IAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAA;AAAA,UACA,IAAA,CAAK,YAAA;AAAA,UACL,KAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACJ;AACA,QAAA;AAAA,MACJ,KAAK,aAAA;AACD,QAAA,qBAAA;AAAA,UACI,GAAA;AAAA,UACA,IAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAA;AAAA,UACA,IAAA,CAAK,YAAA;AAAA,UACL,KAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACJ;AACA,QAAA;AAAA,MACJ,KAAK,MAAA;AACD,QAAA,cAAA;AAAA,UACI,GAAA;AAAA,UACA,IAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAA;AAAA,UACA,IAAA,CAAK,YAAA;AAAA,UACL,KAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACJ;AACA,QAAA;AAAA,MACJ,KAAK,SAAA;AACD,QAAA,aAAA;AAAA,UACI,GAAA;AAAA,UACA,IAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAA;AAAA,UACA,IAAA,CAAK,YAAA;AAAA,UACL,KAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACJ;AACA,QAAA;AAAA,MACJ,KAAK,UAAA;AACD,QAAA,cAAA;AAAA,UACI,GAAA;AAAA,UACA,IAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAA;AAAA,UACA,IAAA,CAAK,YAAA;AAAA,UACL,KAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACJ;AACA,QAAA;AAAA,MACJ,KAAK,SAAA;AACD,QAAA,aAAA;AAAA,UACI,GAAA;AAAA,UACA,IAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAA;AAAA,UACA,IAAA,CAAK,YAAA;AAAA,UACL,KAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACJ;AACA,QAAA;AAAA,MACJ,KAAK,SAAA;AACD,QAAA,aAAA;AAAA,UACI,GAAA;AAAA,UACA,IAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAA;AAAA,UACA,IAAA,CAAK,YAAA;AAAA,UACL,KAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACJ;AACA,QAAA;AAAA;AAIR,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,MAAA,EAAQ,MAAM,CAAA;AAC7B,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,IAAA,KAAS,MAAM,CAAA,EAAG;AAC3E,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,IAAI,IAAI,CAAA;AAClD,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,MAAM,UAAU,OAAA,CAAQ,KAAA;AAAA,QACpB,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA;AAAA,QAC9B,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,GAAI;AAAA,OACnC;AACA,MAAA,GAAA,CAAI,OAAO,GAAA,EAAK,OAAA,EAAS,IAAA,CAAK,YAAA,EAAc,UAAU,MAAM,CAAA;AAAA,IAChE;AACA,IAAA,GAAA,CAAI,OAAA,EAAQ;AACZ,IAAA,GAAA,CAAI,OAAA,EAAQ;AAEZ,IAAA,eAAA;AAAA,MACI,GAAA;AAAA,MACA,UAAA;AAAA,MACA,IAAA,CAAK,YAAA;AAAA,MACL,KAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA,CAAK,cAAA;AAAA,MACL,MAAA;AAAA,MACA,IAAA,CAAK,UAAU,iBAAA,EAAkB;AAAA,MACjC,KAAK,QAAA,CAAS;AAAA,KAClB;AAMA,IAAA,MAAM,OAAA,GAAU,KAAK,SAAA,CAAU,GAAA,CAAI,KAAK,SAAA,CAAU,GAAA,CAAI,SAAS,CAAC,CAAA;AAChE,IAAA,IAAI,OAAA,EAAS;AACT,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,iBAAA,EAAkB;AACnD,MAAA,MAAM,IAAA,GAAO,EAAA;AAEb,MAAA,MAAM,aAAA,GAAgB,CAClB,KAAA,EACA,KAAA,EACA,MAAA,KAC8B;AAC9B,QAAA,MAAM,IAAI,IAAA,CAAK,YAAA,CAAa,QAAA,CAAS,KAAA,EAAO,YAAY,MAAM,CAAA;AAC9D,QAAA,GAAA,CAAI,IAAA,EAAK;AACT,QAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,QAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,QAAA,GAAA,CAAI,WAAA,CAAY,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA;AACtB,QAAA,GAAA,CAAI,SAAA,EAAU;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAC,CAAA;AACf,QAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAC,CAAA;AACpB,QAAA,GAAA,CAAI,MAAA,EAAO;AACX,QAAA,GAAA,CAAI,WAAA,CAAY,EAAE,CAAA;AAElB,QAAA,MAAM,KAAA,GAAQ,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA;AAC9C,QAAA,GAAA,CAAI,IAAA,GAAO,qCAAA;AACX,QAAA,MAAM,EAAA,GAAK,GAAA,CAAI,WAAA,CAAY,KAAK,CAAA,CAAE,KAAA;AAClC,QAAA,MAAM,OAAO,EAAA,GAAK,EAAA;AAClB,QAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,QAAA,GAAA,CAAI,SAAS,MAAA,EAAQ,CAAA,GAAI,IAAA,GAAO,CAAA,EAAG,MAAM,IAAI,CAAA;AAC7C,QAAA,GAAA,CAAI,SAAA,GAAY,SAAA;AAChB,QAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAChB,QAAA,GAAA,CAAI,QAAA,CAAS,KAAA,EAAO,MAAA,GAAS,CAAA,EAAG,IAAI,CAAC,CAAA;AACrC,QAAA,GAAA,CAAI,OAAA,EAAQ;AACZ,QAAA,OAAO,EAAE,GAAG,IAAA,EAAK;AAAA,MACrB,CAAA;AAGA,MAAA,IAAI,aAAA,GAA+B,IAAA;AACnC,MAAA,IAAI,gBAAA,GAAmB,CAAA;AACvB,MAAA,IAAI,KAAK,UAAA,EAAY;AACjB,QAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,IAAA,CAAK,UAAA;AAC1B,QAAA,IAAI,KAAK,eAAA,EAAiB;AAGtB,UAAA,MAAM,SAAS,aAAA,CAAc,GAAA,EAAK,KAAA,CAAM,MAAA,CAAO,MAAM,EAAE,CAAA;AACvD,UAAA,MAAM,SAAS,aAAA,CAAc,GAAA,EAAK,KAAA,CAAM,MAAA,CAAO,IAAI,EAAE,CAAA;AACrD,UAAA,MAAM,OAAA,GAAU,IAAA,CAAK,oBAAA,KAAyB,KAAA,GAAQ,MAAA,GAAS,MAAA;AAC/D,UAAA,aAAA,GAAgB,OAAA,CAAQ,CAAA;AACxB,UAAA,gBAAA,GAAmB,OAAA,CAAQ,IAAA;AAAA,QAC/B,CAAA,MAAO;AAEH,UAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,oBAAA,KAAyB,KAAA,GAAQ,GAAA,GAAM,GAAA;AAC1D,UAAA,MAAM,KAAA,GACF,KAAK,oBAAA,KAAyB,KAAA,GAAQ,MAAM,MAAA,CAAO,EAAA,GAAK,MAAM,MAAA,CAAO,IAAA;AACzE,UAAA,MAAM,GAAA,GAAM,aAAA,CAAc,KAAA,EAAO,KAAA,EAAO,EAAE,CAAA;AAC1C,UAAA,aAAA,GAAgB,GAAA,CAAI,CAAA;AACpB,UAAA,gBAAA,GAAmB,GAAA,CAAI,IAAA;AAAA,QAC3B;AAAA,MACJ,CAAA,MAAO;AAEH,QAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,IAAA;AACtC,QAAA,MAAM,GAAA,GAAM,aAAA;AAAA,UACR,OAAA,CAAQ,KAAA;AAAA,UACR,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,EAAA,GAAK,MAAM,MAAA,CAAO,IAAA;AAAA,UACtC;AAAA,SACJ;AACA,QAAA,aAAA,GAAgB,GAAA,CAAI,CAAA;AACpB,QAAA,gBAAA,GAAmB,GAAA,CAAI,IAAA;AAAA,MAC3B;AAGA,MAAA,IAAI,IAAA,CAAK,sBAAA,IAA0B,aAAA,KAAkB,IAAA,EAAM;AACvD,QAAA,MAAM,WAAA,GAA2B,CAAC,IAAA,EAAM,IAAA,EAAM,OAAO,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA;AAClF,QAAA,MAAM,UACF,IAAA,CAAK,yBAAA,KAA8B,QAC7B,IAAA,GAAA,CACC,IAAA,CAAK,6BAA6B,WAAA,EAAa,QAAA;AAAA,UAC5C,IAAA,CAAK;AAAA,SACT;AACV,QAAA,IAAI,OAAA,EAAS;AACT,UAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,SAAsB,CAAA;AACjE,UAAA,wBAAA;AAAA,YACI,GAAA;AAAA,YACA,OAAA,CAAQ,IAAA;AAAA,YACR,UAAA;AAAA,YACA,KAAA;AAAA,YACA,MAAA;AAAA,YACA,gBAAgB,IAAA,GAAO,CAAA;AAAA,YACvB,IAAA;AAAA,YACA;AAAA,WACJ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAIA,IAAA,IAAI,QAAA,GAAW,MAAA;AACf,IAAA,KAAA,MAAW,YAAY,gBAAA,EAAkB;AACrC,MAAA,MAAM,MAAM,QAAA,CAAS,SAAA;AACrB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAG5B,MAAA,GAAA,CAAI,YAAY,KAAA,CAAM,UAAA;AACtB,MAAA,GAAA,CAAI,SAAS,CAAA,EAAG,QAAA,EAAU,MAAA,GAAS,IAAA,CAAK,gBAAgB,cAAc,CAAA;AACtE,MAAA,QAAA,IAAY,cAAA;AAGZ,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,KAAK,CAAA,EAAG,QAAA,EAAU,MAAA,GAAS,IAAA,CAAK,gBAAgB,KAAK,CAAA;AACzD,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,SAAA,CAAU,GAAG,QAAQ,CAAA;AAGzB,MAAA,GAAA,CAAI,YAAY,KAAA,CAAM,UAAA;AACtB,MAAA,GAAA,CAAI,SAAS,CAAA,EAAG,CAAA,EAAG,MAAA,GAAS,IAAA,CAAK,gBAAgB,KAAK,CAAA;AAGtD,MAAA,MAAM,SAAA,GACF,QAAA,CAAS,OAAA,IAAA,CACR,MAAe;AACZ,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,WAAW,CAAA;AAC7C,QAAA,OAAO,CAAC,EAAA,IAAM,EAAA,KAAO,OAAA,IAAW,OAAO,IAAA,CAAK,SAAA;AAAA,MAChD,CAAA,GAAG;AAEP,MAAA,IAAI,SAAA,EAAW;AACX,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,IAAI,IAAI,CAAA;AAClD,QAAA,IAAI,OAAA,EAAS;AACT,UAAA,MAAM,UAAU,OAAA,CAAQ,KAAA;AAAA,YACpB,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA;AAAA,YAC9B,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,GAAI;AAAA,WACnC;AACA,UAAA,MAAM,SAAA,GAAY,GAAA,CAAI,aAAA,GAAgB,OAAO,CAAA;AAC7C,UAAA,MAAM,cAAc,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,IAAK,CAAA;AAC9D,UAAA,MAAM,WAAA,GAAc,SAAA,GACd,iBAAA,CAAkB,SAAA,EAAW,WAAW,CAAA,GACxC,MAAA;AACN,UAAA,GAAA,CAAI,OAAO,GAAA,EAAK,OAAA,EAAS,KAAK,YAAA,EAAc,QAAA,EAAU,OAAO,WAAW,CAAA;AACxE,UAAA,IAAI,WAAA,EAAa;AACb,YAAA,eAAA;AAAA,cACI,GAAA;AAAA,cACA,WAAA;AAAA,cACA,IAAA,CAAK,YAAA;AAAA,cACL,KAAA;AAAA,cACA,MAAA;AAAA,cACA,KAAA;AAAA,cACA,IAAA,CAAK,cAAA;AAAA,cACL,CAAA;AAAA,cACA,qBAAqB,WAAW,CAAA;AAAA,cAChC,KAAK,QAAA,CAAS;AAAA,aAClB;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAEA,MAAA,GAAA,CAAI,OAAA,EAAQ;AACZ,MAAA,QAAA,IAAY,KAAA;AAAA,IAChB;AAIA,IAAA,IAAI,IAAA,CAAK,UAAA,IAAc,QAAA,IAAY,QAAA,CAAS,MAAM,CAAA,EAAG;AACjD,MAAA,MAAM,cAAc,MAAA,GAAS,kBAAA;AAC7B,MAAA,YAAA;AAAA,QACI,GAAA;AAAA,QACA,IAAA;AAAA,QACA,QAAA;AAAA,QACA,QAAA,CAAS,GAAA;AAAA,QACT,IAAA,CAAK,YAAA;AAAA,QACL,KAAA;AAAA,QACA,MAAA;AAAA,QACA,WAAA;AAAA,QACA,MAAA,GAAS;AAAA,OACb;AAAA,IACJ;AAIA,IAAA;AACI,MAAA,MAAM,WAAA,GAA2B,CAAC,IAAA,EAAM,IAAA,EAAM,OAAO,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA;AAClF,MAAA,MAAM,mBACF,IAAA,CAAK,yBAAA,KAA8B,QAC7B,IAAA,GAAA,CACC,IAAA,CAAK,6BAA6B,WAAA,EAAa,QAAA;AAAA,QAC5C,IAAA,CAAK;AAAA,OACT;AACV,MAAA,MAAM,aAAA,GACF,IAAA,CAAK,mBAAA,IACL,CAAC,KAAK,sBAAA,IACN,gBAAA,IACA,IAAA,CAAK,MAAA,GAAS,CAAA,IACd,QAAA,CAAS,QAAA,IAAY,IAAA,CAAK,UAAU,MAAA,GAAS,CAAA;AACjD,MAAA,MAAM,iBAAA,GAAoB,aAAA,GAAgB,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA,GAAI,MAAA;AAEtE,MAAA,IAAI,KAAK,MAAA,EAAQ;AAEb,QAAA,OAAA,CAAQ,GAAA;AAAA,UACJ,kCAAA;AAAA,UACA,IAAA,CAAK,mBAAA;AAAA,UACL,OAAA;AAAA,UACA,IAAA,CAAK,SAAA;AAAA,UACL,YAAA;AAAA,UACA,gBAAA;AAAA,UACA,SAAA;AAAA,UACA,IAAA,CAAK,MAAA;AAAA,UACL,aAAA;AAAA,UACA,QAAA,CAAS,QAAA;AAAA,UACT,YAAA;AAAA,UACA,KAAK,SAAA,CAAU,MAAA;AAAA,UACf,eAAA;AAAA,UACA,QAAA,CAAS,QAAA,IAAY,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS;AAAA,SACjD;AAAA,MACJ;AAEA,MAAA,cAAA;AAAA,QACI,GAAA;AAAA,QACA,IAAA;AAAA,QACA,QAAA;AAAA,QACA,IAAA,CAAK,YAAA;AAAA,QACL,KAAA;AAAA,QACA,MAAA;AAAA,QACA,QAAA;AAAA,QACA,cAAA,KAAmB,CAAA,GAAI,MAAA;AAAA,QACvB,KAAK,QAAA,CAAS,QAAA;AAAA,QACd,IAAA,CAAK,SAAA;AAAA,QACL,iBAAA;AAAA,QACA,IAAA,CAAK;AAAA,OACT;AAIA,MAAA,IAAI,aAAA,EAAe;AACf,QAAA,MAAMC,WAAU,IAAA,CAAK,SAAA,CAAU,IAAI,IAAA,CAAK,SAAA,CAAU,SAAS,CAAC,CAAA;AAC5D,QAAA,IAAIA,QAAAA,EAAS;AACT,UAAA,MAAM,UAAA,GAAa,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,SAAsB,CAAA;AACjE,UAAA,qBAAA;AAAA,YACI,GAAA;AAAA,YACAA,QAAAA,CAAQ,IAAA;AAAA,YACR,UAAA;AAAA,YACA,IAAA,CAAK,UAAU,MAAA,GAAS,CAAA;AAAA,YACxB,QAAA;AAAA,YACA,IAAA,CAAK,YAAA;AAAA,YACL,KAAA;AAAA,YACA,MAAA;AAAA,YACA,QAAA;AAAA,YACA,KAAK,QAAA,CAAS;AAAA,WAClB;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAIA,IAAA,IAAI,KAAK,SAAA,EAAW;AAChB,MAAA,eAAA;AAAA,QACI,GAAA;AAAA,QACA,IAAA,CAAK,SAAA;AAAA,QACL,UAAA;AAAA,QACA,QAAA;AAAA,QACA,IAAA,CAAK,YAAA;AAAA,QACL,KAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,IAAA,CAAK,cAAA;AAAA,QACL,QAAA;AAAA,QACA,IAAA,CAAK,SAAA;AAAA,QACL,IAAA,CAAK,UAAU,iBAAA,EAAkB;AAAA,QACjC,KAAK,QAAA,CAAS,SAAA;AAAA,QACd,IAAA,CAAK;AAAA,OACT;AAAA,IACJ;AAIA,IAAA,IAAI,KAAK,SAAA,EAAW;AAChB,MAAA,MAAM,QAAA,GAAW,EAAA;AACjB,MAAA,MAAM,MAAA,GAAS,EAAA;AACf,MAAA,MAAM,EAAA,GAAK,SAAS,QAAA,GAAW,CAAA;AAC/B,MAAA,MAAM,EAAA,GAAK,MAAA,GAAS,MAAA,GAAS,QAAA,GAAW,CAAA;AACxC,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,WAAA,GAAc,GAAA;AAElB,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,MAAA,EAAQ,MAAM,CAAA;AAC7B,MAAA,GAAA,CAAI,IAAA,EAAK;AAET,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,GAAA,CAAI,IAAI,EAAA,EAAI,QAAA,GAAW,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AAC5C,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,IAAA,EAAK;AACT,MAAA,GAAA,CAAI,SAAA,CAAU,IAAA,CAAK,SAAA,EAAW,EAAA,GAAK,QAAA,GAAW,GAAG,EAAA,GAAK,QAAA,GAAW,CAAA,EAAG,QAAA,EAAU,QAAQ,CAAA;AACtF,MAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,IAChB;AAEA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAGZ,IAAA,MAAM,UAAU,IAAA,CAAK,SAAA,GACd,KAAK,SAAA,CAAU,GAAA,CAAI,KAAK,SAAA,CAAU,QAAQ,CAAA,IAAK,IAAA,GAC/C,KAAK,SAAA,CAAU,GAAA,CAAI,KAAK,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA,IAAK,IAAA;AACxD,IAAA,IAAA,CAAK,qBAAqB,OAAO,CAAA;AAIjC,IAAA,IAAA,CAAK,cAAA,CAAe,MAAA;AAAA,MAChB,IAAA,CAAK,OAAA;AAAA,MACL,IAAA,CAAK,YAAA;AAAA,MACL,QAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA,CAAK,UAAU,iBAAA,EAAkB;AAAA,MACjC,IAAA,CAAK;AAAA,KACT;AAIA,IAAA,IAAI,KAAK,mBAAA,EAAqB;AAC1B,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,cAAA,CAAe,kBAAA,EAAmB;AACnD,MAAA,IAAI,GAAA,IAAO,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI,WAAW,IAAA,EAAM;AAC5C,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,sBAAA,CAAuB,GAAG,CAAA;AAC9C,QAAA,IAAI,QAAQ,IAAA,CAAK,mBAAA,CAAoB,UAAU,MAAA,CAAO,CAAA,EAAG,OAAO,CAAC,CAAA;AAAA,MACrE;AAAA,IACJ;AAGA,IAAA,IAAI,KAAK,cAAA,EAAgB;AACrB,MAAA,MAAM,KAAA,GACF,IAAA,CAAK,SAAA,CAAU,MAAA,KAAW,CAAA,IAC1B,KAAK,eAAA,CAAgB,QAAA,IAAY,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,GAAA;AAC7D,MAAA,IAAI,KAAA,KAAU,CAAC,IAAA,CAAK,kBAAA,EAAoB;AACpC,QAAA,IAAA,CAAK,qBAAqB,CAAC,KAAA;AAC3B,QAAA,IAAA,CAAK,cAAA,CAAe,KAAA,CAAM,OAAA,GAAU,KAAA,GAAQ,GAAA,GAAM,MAAA;AAClD,QAAA,IAAA,CAAK,cAAA,CAAe,KAAA,CAAM,aAAA,GAAgB,KAAA,GAAQ,MAAA,GAAS,MAAA;AAAA,MAC/D;AAAA,IACJ;AAGA,IAAA,IAAI,KAAK,YAAA,EAAc;AACnB,MAAA,MAAM,KAAA,GAAQ,KAAK,SAAA,CAAU,MAAA;AAC7B,MAAA,MAAM,iBAAiB,IAAA,CAAK,mBAAA;AAC5B,MAAA,MAAM,aAAa,KAAA,KAAU,CAAA,IAAK,IAAA,CAAK,eAAA,CAAgB,YAAY,KAAA,GAAQ,GAAA;AAC3E,MAAA,MAAM,WAAA,GACF,IAAA,CAAK,eAAA,CAAgB,QAAA,GAAW,KAAK,eAAA,CAAgB,UAAA;AACzD,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,GAAA,CAAI,WAAA,GAAc,cAAc,CAAA,GAAI,GAAA;AAC/D,MAAA,MAAM,cAAA,GACF,KAAK,gBAAA,KAAqB,CAAA,IAC1B,KAAK,cAAA,KAAmB,CAAA,IACxB,KAAK,kBAAA,KAAuB,IAAA;AAChC,MAAA,MAAM,SAAA,GACF,KAAA,KAAU,CAAA,IAAM,UAAA,IAAc,aAAA,IAAiB,cAAA;AACnD,MAAA,IAAI,SAAA,KAAc,KAAK,gBAAA,EAAkB;AACrC,QAAA,IAAA,CAAK,mBAAmB,CAAC,SAAA;AACzB,QAAA,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,OAAA,GAAU,SAAA,GAAY,GAAA,GAAM,MAAA;AACpD,QAAA,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,aAAA,GAAgB,SAAA,GAAY,MAAA,GAAS,MAAA;AAAA,MACjE;AAAA,IACJ;AAGA,IAAA,IAAA,CAAK,6BAAA,EAA8B;AAAA,EACvC;AAAA;AAAA,EAIQ,mBAAA,GAA4B;AAChC,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,UAAA,EAAY;AAC/B,MAAA,IAAA,CAAK,gBAAA,CAAiB,IAAI,GAAA,CAAI,IAAA,EAAM,IAAI,OAAA,CAAQ,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,IACvE;AAAA,EACJ;AAAA,EAEQ,QAAA,GAAiB;AACrB,IAAA,IAAI,KAAK,YAAA,EAAc;AACvB,IAAA,MAAM,GAAA,GAAM,OAAO,gBAAA,IAAoB,CAAA;AACvC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,CAAW,qBAAA,EAAsB;AAInD,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,CAAA,IAAK,IAAA,CAAK,WAAW,CAAA,EAAG;AAC3C,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA,CAAK,UAAA,CAAW,qBAAA,EAAsB;AAC7D,IAAA,KAAA,MAAW,CAAA,IAAK,CAAC,IAAA,CAAK,MAAA,EAAQ,KAAK,WAAA,EAAa,IAAA,CAAK,UAAU,CAAA,EAAG;AAC9D,MAAA,CAAA,CAAE,KAAA,GAAQ,KAAK,KAAA,GAAQ,GAAA;AACvB,MAAA,CAAA,CAAE,MAAA,GAAS,KAAK,MAAA,GAAS,GAAA;AAAA,IAC7B;AAEA,IAAA,MAAM,UAAA,GAAa,KAAK,OAAA,CAAQ,WAAA;AAChC,IAAA,MAAM,WACF,UAAA,GAAa,CAAA,IAAK,UAAA,GAAa,IAAA,CAAK,SAAS,cAAA,CAAe,gBAAA;AAChE,IAAA,IAAI,QAAA,KAAa,KAAK,aAAA,EAAe;AACjC,MAAA,IAAA,CAAK,aAAA,GAAgB,QAAA;AACrB,MAAA,IAAA,CAAK,OAAA,EAAS,cAAc,QAAQ,CAAA;AACpC,MAAA,IAAA,CAAK,MAAA,EAAQ,gBAAgB,QAAQ,CAAA;AACrC,MAAA,IAAA,CAAK,WAAA,EAAa,cAAc,QAAQ,CAAA;AACxC,MAAA,IAAA,CAAK,YAAA,EAAc,WAAW,QAAQ,CAAA;AACtC,MAAA,IAAI,KAAK,IAAA,EAAM;AACX,QAAA,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,aAAA,GAAgB,QAAA,GAAW,QAAA,GAAW,KAAA;AACtD,QAAA,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,QAAA,GAAW,YAAA,GAAe,QAAA;AACvD,QAAA,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,QAAA,GAAW,KAAA,GAAQ,KAAA;AAAA,MAC7C;AACA,MAAA,IAAI,QAAA,EAAU;AAEV,QAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AACtB,QAAA,IAAA,CAAK,MAAA,EAAQ,qBAAqB,KAAK,CAAA;AAAA,MAC3C,CAAA,MAAO;AAEH,QAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,QAAA,IAAA,CAAK,OAAA,EAAS,WAAW,IAAI,CAAA;AAC7B,QAAA,IAAA,CAAK,MAAA,EAAQ,qBAAqB,IAAI,CAAA;AAAA,MAC1C;AAAA,IACJ;AAMA,IAAA,IAAI,IAAA,CAAK,UAAU,IAAA,EAAM;AACrB,MAAA,oBAAA,CAAqB,KAAK,KAAK,CAAA;AAC/B,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AAAA,IACjB;AACA,IAAA,IAAA,CAAK,MAAA,EAAO;AACZ,IAAA,IAAA,CAAK,gBAAA,EAAiB;AAAA,EAC1B;AAAA,EAEQ,MAAM,GAAA,EAAyB;AACnC,IAAA,OAAO,KAAK,mBAAA,CAAoB,GAAA,CAAI,IAAI,IAAI,CAAA,IAAK,IAAI,UAAA,IAAc,eAAA;AAAA,EACvE;AAAA;AAAA,EAGQ,cAAA,GAAiB;AACrB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CACjB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,CAAU,IAAA,KAAS,KAAK,CAAA,CACxC,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AAC3B,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAAI,cAAA,EAAgB,CAAC,CAAA;AACjF,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,WAAW,qBAAA,EAAsB;AAC3E,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,cAAA;AACjC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,cAAA,GAAiB,SAAA;AACnD,IAAA,OAAO,EAAE,QAAQ,MAAA,EAAO;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,uBAAuB,OAAA,EAA8E;AACzG,IAAA,IAAI,OAAA,CAAQ,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACxC,IAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,KAAK,cAAA,EAAe;AAC/C,IAAA,MAAM,WAAW,IAAA,CAAK,eAAA;AACtB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,oBAAA,IAAwB,IAAA,CAAK,oBAAoB,QAAQ,CAAA;AACjF,IAAA,IAAI,KAAA,GAAQ,GAAG,KAAA,GAAQ,QAAA;AACvB,IAAA,KAAA,MAAW,CAAA,IAAK,QAAQ,MAAA,EAAQ;AAC5B,MAAA,MAAM,IAAI,IAAA,CAAK,YAAA,CAAa,SAAS,CAAA,CAAE,QAAA,EAAU,UAAU,MAAM,CAAA;AACjE,MAAA,MAAM,IAAI,IAAA,CAAK,YAAA,CAAa,SAAS,CAAA,CAAE,KAAA,EAAO,YAAY,MAAM,CAAA;AAChE,MAAA,IAAI,IAAI,KAAA,EAAO;AAAE,QAAA,KAAA,GAAQ,CAAA;AAAG,QAAA,KAAA,GAAQ,CAAA;AAAA,MAAG;AAAA,IAC3C;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,KAAK,GAAG,OAAO,IAAA;AAEpC,IAAA,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAC,CAAA;AAC3C,IAAA,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAC,CAAA;AAC3C,IAAA,OAAO,EAAE,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,KAAA,EAAM;AAAA,EAChC;AAAA;AAAA,EAGQ,6BAAA,GAAsC;AAC1C,IAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,IAAA,KAAS,CAAA,EAAG;AACrC,IAAA,MAAM,IAAA,GAAO,KAAK,qBAAA,EAAsB;AACxC,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACpB,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,IAAI,aAAa,CAAA;AAC1D,MAAA,IAAI,OAAA,EAAS;AACT,QAAA,OAAA,CAAQ,GAAG,KAAA,CAAM,GAAA,GAAM,GAAG,GAAA,CAAI,CAAA,GAAI,iBAAiB,CAAC,CAAA,EAAA,CAAA;AAAA,MACxD;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA,EAGQ,qBAAA,GAAgE;AACpE,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,IAAA,CAAK,cAAA,EAAe;AACvC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CACjB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,CAAU,IAAA,KAAS,KAAK,CAAA,CACxC,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AAC3B,IAAA,MAAM,SAAiD,EAAC;AACxD,IAAA,IAAI,CAAA,GAAI,MAAA;AACR,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AACxB,MAAA,MAAA,CAAO,KAAK,EAAE,CAAA,EAAG,aAAA,EAAe,GAAA,CAAI,MAAM,CAAA;AAC1C,MAAA,CAAA,IAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,GAAI,cAAA;AAAA,IAC3B;AACA,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEQ,oBAAoB,QAAA,EAAgC;AACxD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc,QAAQ,CAAA;AAClD,IAAA,IAAI,WAAW,IAAA,CAAK,GAAA;AACpB,IAAA,IAAI,WAAW,IAAA,CAAK,GAAA;AAGpB,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,IAAA,KAAS,MAAM,CAAA,EAAG;AAC3E,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,IAAI,IAAI,CAAA;AAClD,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA;AACzC,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,GAAI,CAAA;AAC1C,MAAA,KAAA,IAAS,MAAM,EAAA,EAAI,GAAA,GAAM,MAAM,GAAA,GAAM,OAAA,CAAQ,QAAQ,GAAA,EAAA,EAAO;AACxD,QAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,GAAG,CAAA,EAAG,KAAA;AACxB,QAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,MAAA,EAAW;AACnC,QAAA,MAAM,IAAA,GAAiB,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,GAC/B,CAAA,CAAwB,MAAA,CAAO,CAAC,CAAA,KAAmB,CAAA,KAAM,IAAI,CAAA,GAC9D,CAAC,CAAW,CAAA;AAClB,QAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AAClB,UAAA,IAAI,QAAA,CAAS,CAAC,CAAA,EAAG;AACb,YAAA,IAAI,CAAA,GAAI,UAAU,QAAA,GAAW,CAAA;AAC7B,YAAA,IAAI,CAAA,GAAI,UAAU,QAAA,GAAW,CAAA;AAAA,UACjC;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,IAAA,MAAM,GAAA,GAAA,CAAO,QAAA,GAAW,QAAA,IAAY,CAAA,GAAI,IAAA,CAAK,cAAA;AAC7C,IAAA,MAAM,QAAA,GAAW,QAAA,KAAa,QAAA,GAAW,CAAA,GAAA,CAAK,WAAW,QAAA,IAAY,CAAA;AACrE,IAAA,OAAO;AAAA,MACH,GAAA,EAAK,GAAA,GAAM,QAAA,GAAW,IAAA,CAAK,gBAAA;AAAA,MAC3B,GAAA,EAAK,GAAA,GAAM,QAAA,GAAW,IAAA,CAAK;AAAA,KAC/B;AAAA,EACJ;AAAA,EA8WQ,oBAAoB,KAAA,EAA4B;AACpD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,WAAW,qBAAA,EAAsB;AAC3E,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,IAAA;AAC/B,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,OAAA,GAAU,IAAA,CAAK,GAAA;AAC/B,IAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,KAAK,cAAA,EAAe;AAC/C,IAAA,MAAM,aAAa,IAAA,CAAK,oBAAA,IAAwB,IAAA,CAAK,mBAAA,CAAoB,KAAK,QAAQ,CAAA;AACtF,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,MACR,KAAK,YAAA,CAAa,eAAA,CAAgB,CAAA,EAAG,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA,MAC1D,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,CAAA,EAAG,YAAY,MAAM;AAAA,KACxD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,gBAAA,CAAiB,UAAkB,KAAA,EAA6B;AACpE,IAAA,MAAM,KAAA,GAAsB,EAAE,QAAA,EAAU,KAAA,EAAM;AAC9C,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,mBAAA,CAAoB,QAAQ,CAAA;AAC3C,IAAA,IAAI,CAAA,IAAK,IAAA,EAAM,KAAA,CAAM,SAAA,GAAY,CAAA;AACjC,IAAA,OAAO,KAAA;AAAA,EACX;AAAA;AAAA,EAGQ,uBAAuB,WAAA,EAAsC;AACjE,IAAA,IAAI,YAAY,WAAA,EAAa;AAEzB,MAAA,MAAM,WAAA,GAAc,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,WAAA,CAAY,KAAK,CAAA;AAGzE,MAAA,MAAM,cAAA,GACD,WAAA,EAAa,IAAA,EAA6C,QAAA,KAAa,IAAA;AAC5E,MAAA,IAAI,kBAAkB,WAAA,EAAa;AAC/B,QAAA,MAAM,UAAA,GAAa,WAAA,CAAY,WAAA,KAAgB,UAAA,GAAa,IAAA,GAAO,IAAA;AAEnE,QAAA,IAAA,CAAK,uBAAA,CAAwB,YAAY,IAAI,CAAA;AAC7C,QAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,gBAAA,EAAkB;AAAA,UAChC,OAAO,WAAA,CAAY,KAAA;AAAA,UACnB,IAAA,EAAM,SAAA;AAAA,UACN,MAAM,WAAA,CAAY,IAAA;AAAA,UAClB,cAAc,IAAA,CAAK,YAAA;AAAA,UACnB,OAAA,EAAS;AAAA,YACL;AAAA,cACI,KAAA,EAAO,WAAA,CAAY,WAAA,KAAgB,UAAA,GAAa,WAAA,GAAc,WAAA;AAAA,cAC9D,QAAA,EAAU,CAAA;AAAA,cACV,MAAM,WAAA,CAAY,IAAA;AAAA,cAClB,iBAAA,EAAmB;AAAA;AACvB;AACJ,SACH,CAAA;AACD,QAAA;AAAA,MACJ;AAEA,MAAA,MAAM,QAAQ,WAAA,CAAY,WAAA;AAC1B,MAAA,MAAM,WAAW,IAAA,CAAK,iBAAA,CAAkB,IAAI,WAAA,CAAY,KAAK,KAAK,EAAC;AACnE,MAAA,MAAM,WAAW,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AACzD,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACV,KAAA;AAAA,QACA,QAAA,EAAU,CAAA;AAAA,QACV,QAAA,EAAU,CAAA;AAAA,QACV,SAAA,EAAW,IAAA;AAAA,QACX,mBAAmB,WAAA,CAAY;AAAA,OAClC,CAAA;AACD,MAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,WAAA,CAAY,KAAA,EAAO,QAAQ,CAAA;AACtD,MAAA,IAAA,CAAK,qBAAqB,WAAA,CAAY,KAAA;AACtC,MAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,MAAA;AAAA,IACJ;AAMA,IAAA,MAAM,YAAA,GAAe,WAAA,CAAY,KAAA,KAAU,IAAA,CAAK,eAAA;AAChD,IAAA,MAAM,mBAAA,GAAsB,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,YAAY,KAAK,CAAA;AACxE,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,cAAA,KAAmB,WAAA,CAAY,KAAA;AAC3D,IAAA,MAAM,gBAAA,GACF,CAAC,CAAC,mBAAA,IACF,mBAAA,CAAoB,MAAA,GAAS,CAAA,IAC7B,mBAAA,CAAoB,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA;AAC5C,IAAA,MAAM,SAAA,GAAY,CAAC,mBAAA,IAAuB,mBAAA,CAAoB,MAAA,KAAW,CAAA;AACzE,IAAA,MAAM,mBAAA,GACF,CAAC,YAAA,IAAgB,cAAA,KAAmB,gBAAA,IAAoB,SAAA,CAAA;AAC5D,IAAA,IAAA,CAAK,oBAAA,CAAqB,YAAY,KAAK,CAAA;AAC3C,IAAA,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,WAAA,CAAY,KAAK,CAAA;AAC/C,IAAA,IAAI,YAAA,EAAc;AAClB,IAAA,IAAI,mBAAA,EAAqB;AAGrB,MAAA,IAAI,SAAA,EAAW;AACX,QAAA,MAAM,GAAA,GAAM,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,WAAA,CAAY,KAAK,CAAA;AACjE,QAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,QAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,QAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,QAAA,IAAI,GAAA,EAAK;AACL,UAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,yBAAA,EAA2B;AAAA,YACzC,OAAO,WAAA,CAAY,KAAA;AAAA,YACnB,MAAM,GAAA,CAAI,IAAA;AAAA,YACV,cAAc,IAAA,CAAK;AAAA,WACtB,CAAA;AAAA,QACL;AAAA,MACJ;AACA,MAAA;AAAA,IACJ;AACA,IAAA,IAAI,IAAA,CAAK,cAAA,KAAmB,WAAA,CAAY,KAAA,OAAY,cAAA,GAAiB,IAAA;AACrE,IAAA,MAAM,aAAA,GAAgB,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,WAAA,CAAY,KAAK,CAAA;AAC3E,IAAA,MAAM,eACF,aAAA,EAAe,IAAA,KAAS,UAAA,IACxB,CAAC,CAAE,aAAA,CAAgC,kBAAA;AACvC,IAAA,MAAM,cACF,WAAA,CAAY,IAAA,KAAS,UAAA,IAAc,CAAC,eAAe,QAAA,GAAW,WAAA;AAClE,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,iBAAA,EAAmB;AAAA,MACjC,OAAO,WAAA,CAAY,KAAA;AAAA,MACnB,MAAM,WAAA,CAAY,IAAA;AAAA,MAClB,MAAA,EAAQ,WAAA;AAAA,MACR,MAAM,WAAA,CAAY,IAAA;AAAA,MAClB,cAAc,IAAA,CAAK;AAAA,KACtB,CAAA;AAAA,EACL;AAAA;AAAA,EAGQ,wBAAA,CAAyB,GAAW,CAAA,EAAiB;AACzD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,WAAW,qBAAA,EAAsB;AAC3E,IAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,KAAK,cAAA,EAAe;AAC/C,IAAA,MAAM,aAAa,IAAA,CAAK,oBAAA,IAAwB,IAAA,CAAK,mBAAA,CAAoB,KAAK,QAAQ,CAAA;AACtF,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,cAAA;AACrC,IAAA,IAAI,CAAA,IAAK,MAAA,IAAU,CAAA,IAAK,SAAA,EAAW;AACnC,IAAA,IAAA,CAAK,sBAAA,GAAyB,IAAA;AAC9B,IAAA,MAAM,cAAc,IAAA,CAAK,YAAA,CAAa,gBAAgB,CAAA,EAAG,IAAA,CAAK,UAAU,MAAM,CAAA;AAC9E,IAAA,MAAM,QAAQ,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,CAAA,EAAG,YAAY,MAAM,CAAA;AAClE,IAAA,MAAM,UAAU,IAAA,CAAK,GAAA;AAAA,MACjB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA;AAAA,MACnC,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,WAAW,CAAC;AAAA,KACvE;AACA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA,IAAK,IAAA;AAC3C,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,kBAAA,KAAuB,IAAA,GACvC,EAAE,CAAA,EAAG,CAAA,EAAG,QAAA,EAAU,OAAA,EAAS,KAAA,EAAO,GAAA,EAAI,GACtC,IAAA;AACN,IAAA,IAAI,KAAK,WAAA,EAAa;AAClB,MAAA,IAAA,CAAK,WAAA,CAAY,KAAK,CAAC,CAAA;AACvB,MAAA,IAAI,KAAK,gBAAA,EAAkB;AACvB,QAAA,IAAA,CAAK,YAAY,IAAA,EAAK;AAAA,MAC1B,CAAA,MAAO;AACH,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,WAAA,CAAY,IAAA,GAAO,CAAA;AACpD,QAAA,IAAI,uBAAA,CAAwB,CAAA,EAAG,UAAA,EAAY,IAAA,CAAK,mBAAmB,CAAA,EAAG;AAClE,UAAA,IAAA,CAAK,YAAY,IAAA,EAAK;AAAA,QAC1B,CAAA,MAAA,IAAW,KAAK,SAAA,EAAW;AACvB,UAAA,IAAA,CAAK,YAAY,IAAA,EAAK;AAAA,QAC1B;AAAA,MACJ;AACA,MAAA,IAAA,CAAK,qBAAA,GAAwB,EAAE,KAAA,EAAO,CAAA,EAAE;AAAA,IAC5C;AACA,IAAA,IAAA,CAAK,cAAA,EAAe;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,uBAAuB,KAAA,EAAqB;AAChD,IAAA,MAAM,eAAA,GAAkB,KAAK,cAAA,KAAmB,KAAA;AAChD,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,KAAK,CAAA;AACvD,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,IAAA,IAAA,CAAK,kBAAkB,EAAC;AACxB,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,IAAI,mBAAmB,KAAA,EAAO;AAC1B,MAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,yBAAA,EAA2B;AAAA,QACzC,KAAA;AAAA,QACA,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,cAAc,IAAA,CAAK;AAAA,OACtB,CAAA;AAAA,IACL;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,wBAAwB,KAAA,EAAuB;AACnD,IAAA,IAAI,IAAA,CAAK,cAAA,KAAmB,KAAA,CAAM,KAAA,EAAO;AACzC,IAAA,IAAA,CAAK,qBAAqB,KAAA,CAAM,KAAA;AAChC,IAAA,IAAA,CAAK,iBAAiB,KAAA,CAAM,KAAA;AAC5B,IAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAI,IAAA,CAAK,sBAAsB,KAAK,CAAA;AAC7D,IAAA,IAAA,CAAK,gBAAA,EAAiB;AACtB,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,oBAAA,EAAsB;AAAA,MACpC,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,MAAO,KAAA,CAA4C,IAAA;AAAA,MACnD,aAAA,EAAe,OAAA;AAAA,MACf,eAAA,EAAiB,OAAA;AAAA,MACjB,cAAc,IAAA,CAAK;AAAA,KACtB,CAAA;AAAA,EACL;AAAA;AAAA,EAGQ,sBAAA,CAAuB,OAAA,EAAsB,KAAA,EAAiB,IAAA,EAAoB;AACtF,IAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AAK5B,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,IAAA,CAAK,cAAA,EAAe;AACvC,IAAA,MAAM,aAAa,IAAA,CAAK,oBAAA,IAAwB,IAAA,CAAK,mBAAA,CAAoB,KAAK,QAAQ,CAAA;AACtF,IAAA,MAAM,cAAc,IAAA,CAAK,YAAA,CAAa,SAAS,OAAA,CAAQ,KAAA,EAAO,YAAY,MAAM,CAAA;AAChF,IAAA,IAAI,QAAQ,SAAA,EAAW;AACnB,MAAA,IAAA,CAAK,yBAAA,GAA4B,QAAQ,iBAAA,IAAqB,IAAA;AAC9D,MAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,MAAA,MAAM,YAAA,GACD,MAA2C,kBAAA,KAAuB,IAAA;AACvE,MAAA,MAAM,OAAA,GAAW,KAAA,CAAM,IAAA,EAA6C,QAAA,KAAa,IAAA;AAEjF,MAAA,MAAM,uBACF,IAAA,CAAK,sBAAA,IAA0B,KAAA,CAAM,IAAA,KAAS,aAAa,CAAC,OAAA;AAChE,MAAA,MAAM,GAAA,GAAM,KAAK,SAAA,CAAU,GAAA;AAC3B,MAAA,MAAM,WAAA,GACF,YAAA,IAAgB,OAAA,IAAW,oBAAA,GACrB,CAAA,GACC,IAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,EAAG,KAAA,IAAS,CAAA;AACzC,MAAA,IAAA,CAAK,gBAAA,CAAiB,gBAAA;AAAA,QAClB,KAAA;AAAA,QACA,OAAA,CAAQ,WAAA;AAAA,QACR,OAAA,CAAQ,KAAA;AAAA,QACR,IAAA;AAAA,QACA,WAAA;AAAA,QACA,WAAA;AAAA,QACA,IAAA,CAAK,oBAAA,CAAqB,KAAA,CAAM,KAAA,EAAO,MAAM,KAAK;AAAA,OACtD;AACA,MAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,qBAAA,EAAuB;AAAA,QACrC,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,cAAc,IAAA,CAAK;AAAA,OACtB,CAAA;AAAA,IACL,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,yBAAA,GAA4B,IAAA;AACjC,MAAA,MAAM,YAAA,GAAgB,MAAwB,kBAAA,KAAuB,IAAA;AACrE,MAAA,IAAI,YAAA,EAAc;AACd,QAAA,IAAA,CAAK,qBAAqB,OAAA,CAAQ,KAAA;AAClC,QAAA,MAAM,QAAA,GAAW,KAAA;AACjB,QAAA,MAAM,MAAA,GAAS,KAAK,SAAA,CAAU,GAAA;AAC9B,QAAA,MAAM,cAAc,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,GAAG,KAAA,IAAS,CAAA;AAGxD,QAAA,MAAM,QAAQ,IAAA,CAAK,sBAAA,CAAuB,MAAM,KAAA,EAAO,UAAA,EAAY,SAAS,aAAa,CAAA;AACzF,QAAA,MAAM,QAAQ,IAAA,CAAK,sBAAA,CAAuB,MAAM,KAAA,EAAO,YAAA,EAAc,SAAS,eAAe,CAAA;AAC7F,QAAA,IAAA,CAAK,gBAAA,CAAiB,SAAA;AAAA,UAClB,KAAA;AAAA,UACA,IAAA;AAAA,UACA,WAAA;AAAA,UACA,OAAA,CAAQ,KAAA;AAAA,UACR,KAAA;AAAA,UACA,KAAA;AAAA,UACA,QAAA,CAAS,IAAA;AAAA,UACT,WAAA;AAAA,UACA,QAAA,CAAS,SAAA;AAAA;AAAA,UACY;AAAA,SACzB;AAAA,MACJ,CAAA,MAAO;AACH,QAAA,MAAM,YAAA,GAAe,KAAA;AACrB,QAAA,MAAM,OAAA,GAAU,KAAK,SAAA,CAAU,GAAA;AAC/B,QAAA,MAAM,WAAW,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,GAAG,KAAA,IAAS,CAAA;AAIvD,QAAA,MAAM,EAAE,SAAS,OAAA,EAAS,cAAA,EAAgB,gBAAe,GACrD,IAAA,CAAK,sBAAsB,KAAK,CAAA;AACpC,QAAA,IAAA,CAAK,uBAAuB,cAAA,IAAkB,IAAA;AAC9C,QAAA,IAAA,CAAK,uBAAuB,cAAA,IAAkB,IAAA;AAC9C,QAAA,MAAM,QAAQ,IAAA,CAAK,sBAAA,CAAuB,KAAA,CAAM,KAAA,EAAO,YAAY,OAAO,CAAA;AAC1E,QAAA,MAAM,QAAQ,IAAA,CAAK,sBAAA,CAAuB,KAAA,CAAM,KAAA,EAAO,cAAc,OAAO,CAAA;AAC5E,QAAA,IAAA,CAAK,gBAAA,CAAiB,SAAA;AAAA,UAClB,KAAA;AAAA,UACA,IAAA;AAAA,UACA,WAAA;AAAA,UACA,OAAA,CAAQ,KAAA;AAAA,UACR,KAAA;AAAA,UACA,KAAA;AAAA,UACA,YAAA,CAAa,IAAA;AAAA,UACb,QAAA;AAAA,UACC,YAAA,CAA6D,SAAA;AAAA;AAAA,UACzC;AAAA,SACzB;AAAA,MACJ;AAAA,IACJ;AAKA,IAAA,IAAA,CAAK,wBAAwB,KAAK,CAAA;AAAA,EACtC;AAAA;AAAA,EAGQ,uBAAA,CAAwB,QAA6B,IAAA,EAAoB;AAC7E,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,MAAA,CAAO,KAAK,CAAA;AAC9D,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,IAAA,CAAK,gBAAA,EAAkB;AACtC,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,IAAA,CAAK,cAAA,EAAe;AACvC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,mBAAA,CAAoB,IAAA,CAAK,QAAQ,CAAA;AACzD,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,CAAA,GAAI,MAAA,CAAO,CAAA,GAAI,CAAA;AACzC,IAAA,MAAM,eAAe,IAAA,CAAK,YAAA,CAAa,YAAA,CAAa,UAAA,EAAY,YAAY,MAAM,CAAA;AAClF,IAAA,MAAM,YAAA,GACD,MAA2C,kBAAA,KAAuB,IAAA;AACvE,IAAA,MAAM,OAAA,GAAW,KAAA,CAAM,IAAA,EAA6C,QAAA,KAAa,IAAA;AAEjF,IAAA,MAAM,uBACF,IAAA,CAAK,sBAAA,IAA0B,KAAA,CAAM,IAAA,KAAS,aAAa,CAAC,OAAA;AAChE,IAAA,MAAM,GAAA,GAAM,KAAK,SAAA,CAAU,GAAA;AAC3B,IAAA,MAAM,WAAA,GACF,YAAA,IAAgB,OAAA,IAAW,oBAAA,GACrB,CAAA,GACC,IAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,EAAG,KAAA,IAAS,CAAA;AACzC,IAAA,IAAA,CAAK,yBAAA,GAA4B,IAAA;AACjC,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,IAAA,CAAK,gBAAA,CAAiB,gBAAA;AAAA,MAClB,KAAA;AAAA,MACA,MAAA,CAAO,WAAA;AAAA,MACP,YAAA;AAAA,MACA,IAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,IAAA,CAAK,oBAAA,CAAqB,KAAA,CAAM,KAAA,EAAO,MAAM,KAAK;AAAA,KACtD;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,qBAAA,EAAuB;AAAA,MACrC,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,cAAc,IAAA,CAAK;AAAA,KACtB,CAAA;AAAA,EACL;AAAA;AAAA,EAm1BQ,cAAc,OAAA,EAAmD;AACrE,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACvB,IAAA,IAAA,CAAK,gBAAA,GAAmB,OAAA;AAExB,IAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,KAAK,cAAA,EAAe;AAC/C,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,mBAAA,CAAoB,IAAA,CAAK,QAAQ,CAAA;AAGzD,IAAA,IAAI,EAAA;AACJ,IAAA,IAAI,EAAA;AACJ,IAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAQ;AACzB,MAAA,EAAA,GAAK,IAAA,CAAK,YAAA,CAAa,QAAA,CAAS,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,MAAM,CAAA;AACjF,MAAA,EAAA,GAAK,IAAA,CAAK,aAAa,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAC,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA;AAAA,IAC/E,CAAA,MAAO;AAEH,MAAA,MAAM,IAAI,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,IAAK,OAAA,CAAQ,OAAO,CAAC,CAAA;AAC/C,MAAA,EAAA,GAAK,IAAA,CAAK,aAAa,QAAA,CAAS,CAAA,CAAE,UAAU,IAAA,CAAK,QAAA,EAAU,MAAM,CAAA,GAAI,EAAA;AACrE,MAAA,EAAA,GAAK,KAAK,YAAA,CAAa,QAAA,CAAS,EAAE,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA,GAAI,EAAA;AAAA,IACnE;AAEA,IAAA,MAAM,KAAK,IAAA,CAAK,WAAA;AAChB,IAAA,EAAA,CAAG,KAAA,GAAQ,QAAQ,IAAA,IAAQ,EAAA;AAC3B,IAAA,EAAA,CAAG,MAAM,IAAA,GAAO,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,EAAE,CAAC,CAAA,EAAA,CAAA;AAClC,IAAA,EAAA,CAAG,MAAM,GAAA,GAAM,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,EAAE,CAAC,CAAA,EAAA,CAAA;AACjC,IAAA,EAAA,CAAG,MAAM,OAAA,GAAU,OAAA;AAEnB,IAAA,IAAA,CAAK,cAAA,CAAe,eAAe,IAAI,CAAA;AACvC,IAAA,EAAA,CAAG,KAAA,EAAM;AACT,IAAA,EAAA,CAAG,MAAA,EAAO;AAEV,IAAA,MAAM,SAAS,MAAM;AACjB,MAAA,EAAA,CAAG,mBAAA,CAAoB,WAAW,KAAK,CAAA;AACvC,MAAA,EAAA,CAAG,mBAAA,CAAoB,QAAQ,MAAM,CAAA;AACrC,MAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,IACzB,CAAA;AACA,IAAA,MAAM,SAAS,MAAM;AACjB,MAAA,EAAA,CAAG,mBAAA,CAAoB,WAAW,KAAK,CAAA;AACvC,MAAA,EAAA,CAAG,mBAAA,CAAoB,QAAQ,MAAM,CAAA;AACrC,MAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,IACzB,CAAA;AACA,IAAA,MAAM,KAAA,GAAQ,CAAC,EAAA,KAAsB;AACjC,MAAA,IAAI,EAAA,CAAG,QAAQ,OAAA,EAAS;AACpB,QAAA,EAAA,CAAG,cAAA,EAAe;AAClB,QAAA,MAAA,EAAO;AAAA,MACX,CAAA,MAAA,IAAW,EAAA,CAAG,GAAA,KAAQ,QAAA,EAAU;AAC5B,QAAA,EAAA,CAAG,cAAA,EAAe;AAClB,QAAA,MAAA,EAAO;AAAA,MACX;AAAA,IACJ,CAAA;AACA,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,EAAO;AAC5B,IAAA,EAAA,CAAG,gBAAA,CAAiB,WAAW,KAAK,CAAA;AACpC,IAAA,EAAA,CAAG,iBAAiB,MAAA,EAAQ,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,EACtD;AAAA,EAEQ,eAAA,GAAwB;AAC5B,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,CAAC,KAAK,gBAAA,EAAkB;AACjD,IAAA,IAAA,CAAK,gBAAA,CAAiB,IAAA,GAAO,IAAA,CAAK,WAAA,CAAY,KAAA;AAC9C,IAAA,IAAA,CAAK,WAAA,CAAY,MAAM,OAAA,GAAU,MAAA;AACjC,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,IAAA,IAAA,CAAK,cAAA,CAAe,eAAe,KAAK,CAAA;AACxC,IAAA,IAAA,CAAK,eAAe,gBAAA,IAAmB;AACvC,IAAA,IAAA,CAAK,cAAA,EAAe;AAAA,EACxB;AAAA,EAEQ,eAAA,GAAwB;AAC5B,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACvB,IAAA,IAAA,CAAK,WAAA,CAAY,MAAM,OAAA,GAAU,MAAA;AACjC,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,IAAA,IAAA,CAAK,cAAA,CAAe,eAAe,KAAK,CAAA;AACxC,IAAA,IAAA,CAAK,cAAA,EAAe;AAAA,EACxB;AAAA,EAEQ,gBAAA,GAAyB;AAC7B,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACvB,IAAA,IAAI,IAAA,CAAK,iBAAA,KAAsB,IAAA,EAAM,YAAA,CAAa,KAAK,iBAAiB,CAAA;AACxE,IAAA,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,UAAA,GAAa,IAAA,CAAK,MAAM,MAAA,CAAO,EAAA;AACtD,IAAA,IAAA,CAAK,iBAAA,GAAoB,WAAW,MAAM;AACtC,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,MAAA,IAAI,IAAA,CAAK,WAAA;AACL,QAAA,IAAA,CAAK,WAAA,CAAY,MAAM,UAAA,GAAa,IAAA,CAAK,MAAM,EAAA,CAAG,MAAA,CAAO,KAAK,YAAY,CAAA;AAAA,IAClF,CAAA,EAAG,KAAK,cAAc,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA,EA6EQ,WAAA,CAAY,UAAkB,MAAA,EAAsB;AACxD,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACtB,IAAA,IAAI,KAAK,UAAA,EAAY;AACrB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,mBAAA,CAAoB,IAAA,CAAK,iBAAiB,CAAA;AAChE,IAAA,IAAA,CAAK,WAAW,EAAE,KAAA,EAAO,IAAI,IAAA,CAAK,QAAQ,CAAA,EAAG,GAAA,EAAK,IAAI,IAAA,CAAK,MAAM,CAAA,EAAG,QAAA,EAAU,CAAA,CACzE,IAAA,CAAK,CAAC,OAAA,KAAY;AACf,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AACxC,MAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AAIvB,MAAA,IAAA,CAAK,yBAAA,EAA0B;AAC/B,MAAA,MAAM,GAAA,GAAM,KAAK,SAAA,CAAU,GAAA;AAC3B,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AAClC,MAAA,IAAI,WAAA,GAAc,CAAA;AAClB,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACpB,QAAA,IAAI,GAAA,CAAI,IAAA,IAAQ,OAAA,CAAQ,IAAA,EAAM;AAC9B,QAAA,MAAM,WAAA,GAAc,IAAI,SAAA,CAAU,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,IAAI,IAAI,CAAA;AAC5D,QAAA,IAAI,gBAAgB,EAAA,EAAI;AAEpB,UAAA,GAAA,CAAI,WAAW,CAAA,GAAI,GAAA;AAAA,QACvB,CAAA,MAAO;AACH,UAAA,MAAM,QAAA,GAAW,IAAI,SAAA,CAAU,CAAC,MAAM,CAAA,CAAE,IAAA,GAAO,IAAI,IAAI,CAAA;AACvD,UAAA,GAAA,CAAI,MAAA,CAAO,aAAa,EAAA,GAAK,GAAA,CAAI,SAAS,CAAA,GAAI,QAAA,EAAU,GAAG,GAAG,CAAA;AAC9D,UAAA,WAAA,EAAA;AAAA,QACJ;AAAA,MACJ;AACA,MAAA,IAAI,cAAc,CAAA,EAAG;AACjB,QAAA,IAAA,CAAK,QAAA,GAAW;AAAA,UACZ,GAAG,IAAA,CAAK,QAAA;AAAA,UACR,UAAA,EAAY,IAAA,CAAK,QAAA,CAAS,UAAA,GAAa,WAAA;AAAA,UACvC,QAAA,EAAU,IAAA,CAAK,QAAA,CAAS,QAAA,GAAW;AAAA,SACvC;AACA,QAAA,IAAA,CAAK,2BAAA,EAA4B;AACjC,QAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,QAAA,IAAA,CAAK,cAAA,EAAe;AAAA,MACxB;AAAA,IACJ,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,IAEb,CAAC,CAAA;AAAA,EACT;AAAA;AAAA;AAAA,EAIQ,mBAAA,CAAoB,SAAiB,UAAA,EAA0B;AACnE,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACtB,IAAA,IAAI,KAAK,UAAA,EAAY;AACrB,IAAA,MAAM,KAAA,GAAQ,IAAI,IAAA,CAAK,OAAO,CAAA;AAC9B,IAAA,MAAM,GAAA,GAAM,IAAI,IAAA,CAAK,OAAA,GAAU,aAAa,CAAC,CAAA;AAC7C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,mBAAA,CAAoB,IAAA,CAAK,iBAAiB,CAAA;AAChE,IAAA,IAAA,CAAK,UAAA,CAAW,EAAE,KAAA,EAAO,GAAA,EAAK,UAAU,CAAA,CACnC,IAAA,CAAK,CAAC,OAAA,KAAY;AACf,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AACxC,MAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACvB,MAAA,MAAM,GAAA,GAAM,KAAK,SAAA,CAAU,GAAA;AAC3B,MAAA,MAAM,YAAA,GAAe,IAAI,MAAA,GAAS,CAAA;AAClC,MAAA,IAAI,OAAA,GAAU,KAAA;AACd,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACpB,QAAA,MAAM,GAAA,GAAM,IAAI,SAAA,CAAU,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,IAAI,IAAI,CAAA;AACpD,QAAA,IAAI,GAAA,KAAQ,EAAA,IAAM,GAAA,KAAQ,YAAA,EAAc;AACpC,UAAA,GAAA,CAAI,GAAG,CAAA,GAAI,GAAA;AACX,UAAA,OAAA,GAAU,IAAA;AAAA,QACd;AAAA,MACJ;AACA,MAAA,IAAI,OAAA,EAAS;AACT,QAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,QAAA,IAAA,CAAK,cAAA,EAAe;AAAA,MACxB;AAAA,IACJ,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,IAEb,CAAC,CAAA;AAAA,EACT;AAAA;AAAA,EAGO,SAAS,OAAA,EAAwB;AACpC,IAAA,IAAA,CAAK,MAAA,GAAS,OAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA,EAIO,UAAA,CAAW,SAAiB,GAAA,EAAqB;AACpD,IAAA,MAAM,GAAA,GAAM,KAAK,SAAA,CAAU,GAAA;AAC3B,IAAA,MAAM,MAAM,GAAA,CAAI,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,OAAO,CAAA;AACnD,IAAA,IAAI,QAAQ,EAAA,EAAI;AAChB,IAAA,GAAA,CAAI,GAAG,CAAA,GAAI,GAAA;AACX,IAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,IAAA,IAAA,CAAK,cAAA,EAAe;AAAA,EACxB;AAAA,EAEQ,WAAA,GAAoB;AACxB,IAAA,IAAA,CAAK,WAAW,MAAA,EAAO;AACvB,IAAA,IAAI,IAAA,CAAK,iBAAiB,IAAA,EAAM;AAC5B,MAAA,oBAAA,CAAqB,KAAK,YAAY,CAAA;AACtC,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,IACxB;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,QAAA,GAAW,KAAK,QAAA,CAAS,UAAA;AACvD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,MAAA,GAAS,SAAA;AAC1C,IAAA,MAAM,QAAA,GAAW,KAAK,QAAA,CAAS,QAAA;AAC/B,IAAA,MAAM,WAAW,IAAA,CAAK,cAAA;AACtB,IAAA,MAAM,QAAA,GAAW,GAAA;AACjB,IAAA,MAAM,EAAA,GAAK,YAAY,GAAA,EAAI;AAE3B,IAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAe,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,EAAA,GAAA,CAAM,CAAA,GAAI,CAAA,GAAI,CAAA,IAAK,CAAA;AAEtE,IAAA,MAAM,IAAA,GAAO,CAAC,GAAA,KAAgB;AAC1B,MAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAA,CAAK,GAAA,GAAM,EAAA,IAAM,UAAU,CAAC,CAAA;AAC7C,MAAA,MAAM,IAAA,GAAO,KAAK,GAAG,CAAA;AAErB,MAAA,MAAM,MAAA,GAAS,QAAA,GAAA,CAAY,SAAA,GAAY,QAAA,IAAY,IAAA;AACnD,MAAA,IAAA,CAAK,QAAA,GAAW;AAAA,QACZ,GAAG,IAAA,CAAK,QAAA;AAAA,QACR,YAAY,MAAA,GAAS,OAAA;AAAA,QACrB,QAAA,EAAU;AAAA,OACd;AAEA,MAAA,IAAA,CAAK,eAAA,GAAkB,EAAE,GAAG,IAAA,CAAK,QAAA,EAAS;AAC1C,MAAA,IAAA,CAAK,cAAA,GAAiB,YAAY,CAAA,GAAI,IAAA,CAAA;AACtC,MAAA,IAAA,CAAK,MAAA,EAAO;AAEZ,MAAA,IAAI,MAAM,CAAA,EAAG;AACT,QAAA,IAAA,CAAK,YAAA,GAAe,sBAAsB,IAAI,CAAA;AAAA,MAClD,CAAA,MAAO;AACH,QAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,MACxB;AAAA,IACJ,CAAA;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,sBAAsB,IAAI,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,oBAAoB,KAAA,EAAqB;AAC7C,IAAA,IAAI,CAAC,QAAA,CAAS,KAAK,KAAK,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA,EAAG;AACrD,IAAA,IAAI,IAAA,CAAK,iBAAiB,IAAA,EAAM;AAC5B,MAAA,oBAAA,CAAqB,KAAK,YAAY,CAAA;AACtC,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,IACxB;AAEA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc,KAAK,QAAQ,CAAA;AACvD,IAAA,MAAM,UAAA,GAAA,CAAc,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,GAAA,IAAO,CAAA;AAC3C,IAAA,MAAM,WAAW,IAAA,CAAK,cAAA;AACtB,IAAA,MAAM,YAAY,KAAA,GAAQ,UAAA;AAC1B,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,SAAA,GAAY,QAAQ,IAAI,IAAA,EAAM;AAE3C,IAAA,MAAM,QAAA,GAAW,GAAA;AACjB,IAAA,MAAM,EAAA,GAAK,YAAY,GAAA,EAAI;AAC3B,IAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAe,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,EAAA,GAAA,CAAM,CAAA,GAAI,CAAA,GAAI,CAAA,IAAK,CAAA;AAEtE,IAAA,MAAM,IAAA,GAAO,CAAC,GAAA,KAAgB;AAC1B,MAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAA,CAAK,GAAA,GAAM,EAAA,IAAM,UAAU,CAAC,CAAA;AAC7C,MAAA,MAAM,IAAA,GAAO,KAAK,GAAG,CAAA;AACrB,MAAA,IAAA,CAAK,cAAA,GAAiB,QAAA,GAAA,CAAY,SAAA,GAAY,QAAA,IAAY,IAAA;AAC1D,MAAA,IAAA,CAAK,MAAA,EAAO;AACZ,MAAA,IAAI,MAAM,CAAA,EAAG;AACT,QAAA,IAAA,CAAK,YAAA,GAAe,sBAAsB,IAAI,CAAA;AAAA,MAClD,CAAA,MAAO;AACH,QAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,MACxB;AAAA,IACJ,CAAA;AACA,IAAA,IAAA,CAAK,YAAA,GAAe,sBAAsB,IAAI,CAAA;AAAA,EAClD;AAAA,EAEQ,cAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,gBAAA,GAAmB,CAAA;AACxB,IAAA,IAAA,CAAK,cAAA,GAAiB,CAAA;AACtB,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAC1B,IAAA,IAAA,CAAK,cAAA,EAAe;AAAA,EACxB;AAAA,EAEQ,aAAA,GAAsB;AAC1B,IAAA,IAAA,CAAK,WAAW,MAAA,EAAO;AACvB,IAAA,MAAM,KAAA,GAAQ,KAAK,SAAA,CAAU,MAAA;AAC7B,IAAA,IAAI,UAAU,CAAA,EAAG;AACjB,IAAA,MAAM,gBAAA,GAAmB,kBAAA;AAAA,MACrB,IAAA,CAAK,gBAAA;AAAA,MACL,IAAA,CAAK,qBAAA;AAAA,MACL,IAAA,CAAK,kBAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACT;AACA,IAAA,IAAA,CAAK,mBAAA,GAAsB,gBAAA;AAC3B,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,GAAQ,mBAAmB,SAAS,CAAA;AACjE,IAAA,IAAA,CAAK,QAAA,GAAW,EAAE,GAAG,IAAA,CAAK,UAAU,UAAA,EAAY,QAAA,EAAU,QAAA,EAAU,KAAA,GAAQ,SAAA,EAAU;AACtF,IAAA,IAAA,CAAK,eAAA,GAAkB,EAAE,GAAG,IAAA,CAAK,QAAA,EAAS;AAC1C,IAAA,IAAA,CAAK,cAAA,EAAe;AAAA,EACxB;AAAA;AAAA,EAGA,SAAA,GAAkB;AACd,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,IAAA,CAAK,aAAA,EAAc;AAAA,EACvB;AAAA,EAEQ,uBAAA,GAAgC;AACpC,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACxB,IAAA,IAAA,CAAK,aAAa,SAAA,GAAY,aAAA,CAAc,IAAA,CAAK,KAAA,CAAM,UAAU,EAAE,CAAA;AACnE,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO;AAAA,MACnC,QAAA,EAAU,UAAA;AAAA,MACV,MAAA,EAAQ,CAAA,EAAG,IAAA,CAAK,cAAA,GAAiB,CAAC,CAAA,EAAA,CAAA;AAAA,MAClC,IAAA,EAAM,KAAA;AAAA,MACN,SAAA,EAAW,kBAAA;AAAA,MACX,MAAA,EAAQ,KAAA;AAAA,MACR,KAAA,EAAO,MAAA;AAAA,MACP,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,GAAA;AAAA,MACT,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,cAAA,EAAgB,QAAA;AAAA,MAChB,eAAA,EAAiB,KAAK,KAAA,CAAM,UAAA;AAAA,MAC5B,MAAA,EAAQ,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MAC1C,YAAA,EAAc,KAAA;AAAA,MACd,MAAA,EAAQ,SAAA;AAAA,MACR,OAAA,EAAS,MAAA;AAAA,MACT,SAAA,EAAW,4BAAA;AAAA,MACX,OAAA,EAAS,GAAA;AAAA,MACT,aAAA,EAAe,MAAA;AAAA,MACf,UAAA,EAAY;AAAA,KACf,CAAA;AAAA,EACL;AAAA,EAEQ,yBAAA,GAAkC;AACtC,IAAA,IAAI,CAAC,KAAK,cAAA,EAAgB;AAC1B,IAAA,IAAA,CAAK,eAAe,SAAA,GAAY,eAAA,CAAgB,IAAA,CAAK,KAAA,CAAM,UAAU,EAAE,CAAA;AACvE,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,cAAA,CAAe,KAAA,EAAO;AAAA,MACrC,QAAA,EAAU,UAAA;AAAA,MACV,MAAA,EAAQ,CAAA,EAAG,IAAA,CAAK,cAAA,GAAiB,CAAC,CAAA,EAAA,CAAA;AAAA,MAClC,KAAA,EAAO,CAAA,EAAG,IAAA,CAAK,cAAA,GAAiB,CAAC,CAAA,EAAA,CAAA;AAAA,MACjC,MAAA,EAAQ,KAAA;AAAA,MACR,KAAA,EAAO,MAAA;AAAA,MACP,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,GAAA;AAAA,MACT,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,cAAA,EAAgB,QAAA;AAAA,MAChB,eAAA,EAAiB,KAAK,KAAA,CAAM,UAAA;AAAA,MAC5B,MAAA,EAAQ,CAAA,UAAA,EAAa,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MAC1C,YAAA,EAAc,KAAA;AAAA,MACd,MAAA,EAAQ,SAAA;AAAA,MACR,OAAA,EAAS,MAAA;AAAA,MACT,SAAA,EAAW,4BAAA;AAAA,MACX,OAAA,EAAS,GAAA;AAAA,MACT,aAAA,EAAe,MAAA;AAAA,MACf,UAAA,EAAY;AAAA,KACf,CAAA;AAAA,EACL;AACJ,CAAA;AAt2Na,YAAA,CAwHe,sBAAA,GAAyB,CAAA;AAxHxC,YAAA,CAqIe,0BAAA,GAA6B,CAAA;AArIlD,IAAM,WAAA,GAAN;;;AC35BA,IAAM,mBAAN,MAAoD;AAAA,EAQvD,WAAA,CACqB,GAAA,EAEA,SAAA,GAA2C,gBAAA,EAC9D;AAHmB,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAEA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAVrB,IAAA,IAAA,CAAQ,EAAA,GAAuB,IAAA;AAC/B,IAAA,IAAA,CAAQ,gBAA0C,EAAC;AACnD,IAAA,IAAA,CAAQ,kBAAsD,EAAC;AAC/D,IAAA,IAAA,CAAQ,cAAA,GAAuD,IAAA;AAC/D,IAAA,IAAA,CAAQ,cAAA,GAAiB,GAAA;AACzB,IAAA,IAAA,CAAQ,SAAA,GAAY,KAAA;AAAA,EAMjB;AAAA,EAEH,OAAA,GAAgB;AACZ,IAAA,IAAI,KAAK,EAAA,EAAI;AACb,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,IAAA,CAAK,UAAA,EAAW;AAAA,EACpB;AAAA,EAEA,UAAA,GAAmB;AACf,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAI,IAAA,CAAK,mBAAmB,IAAA,EAAM;AAC9B,MAAA,YAAA,CAAa,KAAK,cAAc,CAAA;AAChC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IAC1B;AACA,IAAA,IAAI,KAAK,EAAA,EAAI;AACT,MAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AACd,MAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AAAA,IACd;AACA,IAAA,IAAA,CAAK,WAAW,cAAc,CAAA;AAAA,EAClC;AAAA,EAEA,OAAO,QAAA,EAAsC;AACzC,IAAA,IAAA,CAAK,aAAA,CAAc,KAAK,QAAQ,CAAA;AAAA,EACpC;AAAA,EAEA,SAAS,QAAA,EAAgD;AACrD,IAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,QAAQ,CAAA;AAAA,EACtC;AAAA;AAAA,EAIQ,UAAA,GAAmB;AACvB,IAAA,IAAA,CAAK,EAAA,GAAK,IAAI,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA;AAEhC,IAAA,IAAA,CAAK,EAAA,CAAG,gBAAA,CAAiB,MAAA,EAAQ,MAAM;AACnC,MAAA,IAAA,CAAK,cAAA,GAAiB,GAAA;AACtB,MAAA,IAAA,CAAK,WAAW,WAAW,CAAA;AAAA,IAC/B,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,EAAA,CAAG,gBAAA,CAAiB,SAAA,EAAW,CAAC,KAAA,KAAU;AAC3C,MAAA,IAAI;AACA,QAAA,MAAM,GAAA,GAAM,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,GAAW,KAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA,CAAM,IAAA;AAC5E,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA;AAC/B,QAAA,IAAI,MAAM,IAAA,CAAK,aAAA,CAAc,QAAQ,CAAA,EAAA,KAAM,EAAA,CAAG,IAAI,CAAC,CAAA;AAAA,MACvD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACJ,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,EAAA,CAAG,gBAAA,CAAiB,OAAA,EAAS,MAAM;AACpC,MAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,MAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACjB,QAAA,IAAA,CAAK,WAAW,cAAc,CAAA;AAC9B,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,MAC3B;AAAA,IACJ,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,EAAA,CAAG,gBAAA,CAAiB,OAAA,EAAS,MAAM;AACpC,MAAA,IAAA,CAAK,IAAI,KAAA,EAAM;AAAA,IACnB,CAAC,CAAA;AAAA,EACL;AAAA,EAEQ,iBAAA,GAA0B;AAC9B,IAAA,IAAA,CAAK,cAAA,GAAiB,WAAW,MAAM;AACnC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,MAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,IAAA,CAAK,UAAA,EAAW;AAAA,IACzC,CAAA,EAAG,KAAK,cAAc,CAAA;AACtB,IAAA,IAAA,CAAK,iBAAiB,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,cAAA,GAAiB,GAAG,GAAM,CAAA;AAAA,EAClE;AAAA,EAEQ,WAAW,MAAA,EAA4B;AAC3C,IAAA,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,CAAA,EAAA,KAAM,EAAA,CAAG,MAAM,CAAC,CAAA;AAAA,EACjD;AACJ;AAGA,SAAS,iBAAiB,GAAA,EAA2B;AACjD,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,MAAM,OAAO,IAAA;AACpD,EAAA,MAAM,CAAA,GAAI,GAAA;AACV,EAAA,IAAI,OAAO,EAAE,CAAA,KAAM,QAAA,IAAY,OAAO,CAAA,CAAE,CAAA,KAAM,UAAU,OAAO,IAAA;AAC/D,EAAA,MAAM,IAAA,GAAO,OAAO,CAAA,CAAE,CAAA,KAAM,QAAA,GAAW,IAAI,IAAA,CAAK,CAAA,CAAE,CAAC,CAAA,CAAE,OAAA,EAAQ,GAAI,KAAK,GAAA,EAAI;AAC1E,EAAA,OAAO;AAAA,IACH,IAAA;AAAA,IACA,KAAQ,CAAA,CAAE,CAAA;AAAA,IACV,KAAQ,CAAA,CAAE,CAAA;AAAA,IACV,QAAQ,OAAO,CAAA,CAAE,MAAA,KAAW,QAAA,GAAW,EAAE,MAAA,GAAS;AAAA,GACtD;AACJ","file":"index.cjs","sourcesContent":["import type { OHLCVBar, PriceRange, Viewport } from \"./types.js\";\n\nexport class DataStore {\n    private bars: OHLCVBar[] = [];\n\n    set(bars: OHLCVBar[]): void {\n        // Sort ascending by timestamp, normalize timestamps to ms\n        this.bars = [...bars].sort((a, b) => a.time - b.time);\n    }\n\n    get all(): OHLCVBar[] {\n        return this.bars;\n    }\n\n    get length(): number {\n        return this.bars.length;\n    }\n\n    getVisible(viewport: Viewport): OHLCVBar[] {\n        const start = Math.max(0, Math.floor(viewport.startIndex));\n        const end = Math.min(\n            this.bars.length - 1,\n            Math.ceil(viewport.endIndex),\n        );\n        return this.bars.slice(start, end + 1);\n    }\n\n    getPriceRange(viewport: Viewport, padding = 0.05): PriceRange {\n        const visible = this.getVisible(viewport);\n        if (visible.length === 0) return { min: 0, max: 1 };\n\n        let min = Infinity;\n        let max = -Infinity;\n\n        for (const bar of visible) {\n            if (bar.low < min) min = bar.low;\n            if (bar.high > max) max = bar.high;\n        }\n\n        const range = max - min;\n        return {\n            min: min - range * padding,\n            max: max + range * padding,\n        };\n    }\n\n    getVolumeRange(viewport: Viewport): { min: number; max: number } {\n        const visible = this.getVisible(viewport);\n        if (visible.length === 0) return { min: 0, max: 1 };\n        const max = Math.max(...visible.map((b) => b.volume ?? 0));\n        return { min: 0, max };\n    }\n\n    get hasVolumeData(): boolean {\n        return this.bars.some(b => 'volume' in b && (b.volume ?? 0) > 0);\n    }\n\n    getPricePrecision(): number {\n        let max = 2;\n        for (const bar of this.bars) {\n            for (const v of [bar.open, bar.high, bar.low, bar.close]) {\n                const s = v.toString();\n                const dot = s.indexOf('.');\n                if (dot !== -1) {\n                    const d = s.length - dot - 1;\n                    if (d > max) max = d;\n                }\n            }\n        }\n        return Math.min(max, 8);\n    }\n\n    /**\n     * Prepends historical bars before the current dataset.\n     * Filters out any bars that overlap with existing data (dedup guard).\n     * Returns the number of bars actually inserted so the caller can shift\n     * viewport indices by the same amount to avoid a visual jump.\n     */\n    prepend(bars: OHLCVBar[]): number {\n        const cutoff = this.bars[0]?.time ?? Infinity;\n        const filtered = bars\n            .filter(b => b.time < cutoff)\n            .sort((a, b) => a.time - b.time);\n        if (filtered.length === 0) return 0;\n        this.bars = [...filtered, ...this.bars];\n        return filtered.length;\n    }\n}\n","import type { Viewport, PriceRange } from './types.js';\n\nexport class ScaleManager {\n  private static readonly VERTICAL_PADDING_PX = 20;\n\n  // ── X axis: bar index → canvas pixel ──────────────────────────────────────\n\n  xToPixel(index: number, viewport: Viewport, chartWidth: number): number {\n    const visibleBars = Math.max(1, viewport.endIndex - viewport.startIndex);\n    const candleWidth = chartWidth / visibleBars;\n    return (index - viewport.startIndex) * candleWidth + candleWidth / 2;\n  }\n\n  pixelToBarIndex(x: number, viewport: Viewport, chartWidth: number): number {\n    const visibleBars = Math.max(1, viewport.endIndex - viewport.startIndex);\n    const candleWidth = chartWidth / visibleBars;\n    return viewport.startIndex + x / candleWidth - 0.5;\n  }\n\n  candleBodyWidth(viewport: Viewport, chartWidth: number): number {\n    const visibleBars = Math.max(1, viewport.endIndex - viewport.startIndex);\n    const raw = (chartWidth / visibleBars) * 0.7;\n    return Math.max(1, Math.min(raw, 40)); // clamp 1–40px\n  }\n\n  // ── Y axis: price → canvas pixel ──────────────────────────────────────────\n\n  yToPixel(price: number, range: PriceRange, chartHeight: number): number {\n    const { min, max } = range;\n    const pad = ScaleManager.VERTICAL_PADDING_PX;\n    const usable = chartHeight - 2 * pad;\n    return pad + usable - ((price - min) / (max - min)) * usable;\n  }\n\n  pixelToPrice(y: number, range: PriceRange, chartHeight: number): number {\n    const { min, max } = range;\n    const pad = ScaleManager.VERTICAL_PADDING_PX;\n    const usable = chartHeight - 2 * pad;\n    return max - ((y - pad) / usable) * (max - min);\n  }\n\n  // ── Volume: volume value → canvas pixel (bottom-anchored) ─────────────────\n\n  volumeToPixel(\n    volume: number,\n    maxVolume: number,\n    volumePanelHeight: number,\n  ): number {\n    return volumePanelHeight - (volume / maxVolume) * volumePanelHeight * 0.9;\n  }\n}\n\n/**\n * Picks a \"nice\" step size from the 1/2/5 × 10^n series — closest to `rawStep`.\n */\nfunction niceStep(rawStep: number): number {\n  if (!isFinite(rawStep) || rawStep <= 0) return 1;\n  const exp = Math.floor(Math.log10(rawStep));\n  const base = Math.pow(10, exp);\n  const frac = rawStep / base;\n  const nice = frac < 1.5 ? 1 : frac < 3.5 ? 2 : frac < 7.5 ? 5 : 10;\n  return nice * base;\n}\n\n/**\n * Returns an adaptive set of \"nice\" price ticks for the price axis / grid.\n * Tick count scales with `chartHeight`; step values land on the 1/2/5 × 10^n\n * series so labels are readable regardless of range magnitude.\n */\nexport function generatePriceTicks(\n  range: PriceRange,\n  chartHeight: number,\n  targetPxPerLabel = 48,\n): number[] {\n  const { min, max } = range;\n  if (!isFinite(min) || !isFinite(max) || max <= min) return [min];\n  const approxSteps = Math.max(2, Math.floor(chartHeight / targetPxPerLabel));\n  const rawStep = (max - min) / approxSteps;\n  const step = niceStep(rawStep);\n  const first = Math.ceil(min / step) * step;\n  const ticks: number[] = [];\n  // Guard against fp drift with a small epsilon on the upper bound.\n  const eps = step * 1e-6;\n  for (let v = first; v <= max + eps; v += step) {\n    ticks.push(v);\n  }\n  return ticks;\n}\n\n/**\n * Decimal precision implied by the step magnitude — used to format tick labels\n * with just enough digits to distinguish adjacent ticks.\n */\nexport function precisionForStep(step: number, minPrecision = 0): number {\n  if (!isFinite(step) || step <= 0) return minPrecision;\n  const exp = Math.floor(Math.log10(step));\n  return Math.max(minPrecision, -exp);\n}\n","type Listener<T> = (payload: T) => void;\n\nexport class EventEmitter<EventMap extends Record<string, unknown>> {\n  private listeners = new Map<keyof EventMap, Set<Listener<unknown>>>();\n\n  on<K extends keyof EventMap>(event: K, listener: Listener<EventMap[K]>): () => void {\n    if (!this.listeners.has(event)) {\n      this.listeners.set(event, new Set());\n    }\n    this.listeners.get(event)!.add(listener as Listener<unknown>);\n    // Return unsubscribe fn\n    return () => this.off(event, listener);\n  }\n\n  off<K extends keyof EventMap>(event: K, listener: Listener<EventMap[K]>): void {\n    this.listeners.get(event)?.delete(listener as Listener<unknown>);\n  }\n\n  emit<K extends keyof EventMap>(event: K, payload: EventMap[K]): void {\n    this.listeners.get(event)?.forEach((fn) => fn(payload));\n  }\n}\n","import type { AnyDrawingStyle, DrawingToolType } from './types.js';\n\n// ── Deep-partial helper (local, keeps themes.ts self-contained) ───────────────\n\ntype DeepPartial<T> = { [K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K] };\n\n// ── Per-component color groups ────────────────────────────────────────────────\n//\n// These are the colors every UI component refers to for interactive / state\n// coloring.  They live inside `ChartTheme` so both built-in themes and any\n// custom theme override can supply consistent values.\n\n/** Accent and interactive-state colors shared across all UI components. */\nexport interface ChartThemeUi {\n    /** Primary accent color — active borders, highlights (e.g. #2196f3 blue) */\n    accent: string;\n    /** Text color on accented (active) elements */\n    accentText: string;\n    /** Light semi-transparent fill for active list rows / buttons */\n    accentBg: string;\n    /** Slightly stronger semi-transparent fill (drawing-toolbar active icons) */\n    accentBgStrong: string;\n    /** Text color for unimplemented / disabled tool entries */\n    disabledText: string;\n    /** Text color for \"coming soon\" badges */\n    soonBadgeText: string;\n    /** Stream-status indicator dot colors */\n    stream: {\n        connected: string;\n        reconnecting: string;\n        disconnected: string;\n    };\n}\n\n/** Colors specific to the drawing toolbar (LeftBar). */\nexport interface DrawingToolbarColors {\n    /** Default icon color (category buttons, action buttons) */\n    iconColor: string;\n    /** Active/selected icon color */\n    activeIconColor: string;\n    /** Flyout row text for implemented tools */\n    flyoutLabelColor: string;\n    /** Flyout group-heading color */\n    flyoutHeadingColor: string;\n}\n\n/** Colors specific to the top bar and its flyout dropdowns. */\nexport interface TopBarColors {\n    /** Default button text color */\n    btnColor: string;\n    /** Active button text color */\n    activeBtnColor: string;\n    /** Flyout row text color */\n    flyoutRowColor: string;\n    /** Flyout group-header text color */\n    flyoutCategoryColor: string;\n}\n\n/** Colors specific to the bottom bar duration buttons. */\nexport interface BottomBarColors {\n    /** Inactive duration button text */\n    btnColor: string;\n    /** Active duration button background */\n    activeBtnBg: string;\n    /** Active duration button text */\n    activeBtnText: string;\n    /** Active duration button border */\n    activeBtnBorder: string;\n}\n\n/** Colors specific to the indicator overlay pills. */\nexport interface IndicatorOverlayColors {\n    /** Pill background (semi-transparent) */\n    pillBg: string;\n    /** Gear and remove icon color */\n    iconColor: string;\n    /** Dropdown row hover background */\n    dropdownHoverBg: string;\n}\n\n/** Colors for trade/position horizontal level lines. */\nexport interface TradeLevelColors {\n    /** Solid accent color for buy-side UI elements (popover text, button, icon). */\n    buySide: string;\n    /** Solid accent color for sell-side UI elements (popover text, button, icon). */\n    sellSide: string;\n    /** Line + box border color for open executed trades. */\n    tradeLine: string;\n    /** Line + box border color for open positions. */\n    positionLine: string;\n    /** Dashed line color for pending buy orders (limit/stop). */\n    pendingBuyLine: string;\n    /** Dashed line color for pending sell orders (limit/stop). */\n    pendingSellLine: string;\n    /** Primary text color inside the info box. */\n    labelText: string;\n    /** Background fill of the × close button. */\n    closeBtn: string;\n    /** Icon color of the × inside the close button. */\n    closeBtnText: string;\n    /** Background of the floating info box (semi-transparent). */\n    boxBg: string;\n    /** Background of the floating info box when hovered. */\n    boxBgHover: string;\n    /** Color of the 6-dot drag grip icon. */\n    dragHandle: string;\n    /** Color of the drag grip icon when hovered. */\n    dragHandleHover: string;\n}\n\n/**\n * Default per-drawing-type style fallbacks. Each drawing type has an entry that\n * provides default stroke/fill/text values; per-instance `IDrawing.style`\n * overrides these. Used by `resolveStyle()` in `src/drawings/styleUtils.ts`.\n */\nexport type DrawingThemeMap = Record<DrawingToolType, AnyDrawingStyle>;\n\n/** Colors for the Trade Panel side drawer. */\nexport interface TradePanelColors {\n    background: string;\n    border: string;\n    headerBg: string;\n    tabActive: string;\n    tabInactive: string;\n    rowHoverBg: string;\n    rowText: string;\n    rowSubText: string;\n}\n\n// ── Main theme interface ──────────────────────────────────────────────────────\n\nexport interface ChartTheme {\n    // ── Canvas-level colors ──────────────────────────────────────────────────\n    background: string;\n    grid: string;\n    axisText: string;\n    axisBorder: string;\n    crosshair: string;\n    tooltip: { background: string; text: string; border: string };\n    candle: {\n        up: string;\n        down: string;\n        wickUp: string;\n        wickDown: string;\n        /** Border/outline color for up candle bodies. Defaults to `up` if omitted. */\n        borderUp?: string;\n        /** Border/outline color for down candle bodies. Defaults to `down` if omitted. */\n        borderDown?: string;\n    };\n    volume: { up: string; down: string };\n\n    // ── UI component colors ──────────────────────────────────────────────────\n    /** Shared accent / interactive-state colors */\n    ui: ChartThemeUi;\n    /** Drawing toolbar (LeftBar) specific colors */\n    drawingToolbar: DrawingToolbarColors;\n    /** Top bar specific colors */\n    topBar: TopBarColors;\n    /** Bottom bar specific colors */\n    bottomBar: BottomBarColors;\n    /** Indicator overlay (pills) specific colors */\n    indicatorOverlay: IndicatorOverlayColors;\n    /** Trade and position level line colors */\n    tradeLevels: TradeLevelColors;\n    /** Trade Panel side drawer colors */\n    tradePanel: TradePanelColors;\n    /** Per-drawing-type default style fallbacks (keyed by DrawingToolType). */\n    drawing: DrawingThemeMap;\n}\n\n/** A deep-partial version of ChartTheme for use in `themeOverrides`. */\nexport type DeepPartialChartTheme = DeepPartial<ChartTheme>;\n\n// ── Theme helpers ─────────────────────────────────────────────────────────────\n\n/**\n * Deep-merge a partial theme override on top of a full base theme.\n * Only the keys you supply are replaced; everything else falls back to `base`.\n */\nexport function deepMergeTheme(\n    base: ChartTheme,\n    override: DeepPartial<ChartTheme> | undefined,\n): ChartTheme {\n    if (!override) return base;\n    return {\n        background: override.background ?? base.background,\n        grid:       override.grid       ?? base.grid,\n        axisText:   override.axisText   ?? base.axisText,\n        axisBorder: override.axisBorder ?? base.axisBorder,\n        crosshair:  override.crosshair  ?? base.crosshair,\n        tooltip:          { ...base.tooltip,          ...override.tooltip },\n        candle:           { ...base.candle,           ...override.candle },\n        volume:           { ...base.volume,           ...override.volume },\n        ui: {\n            ...base.ui,\n            ...override.ui,\n            stream: { ...base.ui.stream, ...override.ui?.stream },\n        },\n        drawingToolbar:   { ...base.drawingToolbar,   ...override.drawingToolbar },\n        topBar:           { ...base.topBar,           ...override.topBar },\n        bottomBar:        { ...base.bottomBar,        ...override.bottomBar },\n        indicatorOverlay: { ...base.indicatorOverlay, ...override.indicatorOverlay },\n        tradeLevels:      { ...base.tradeLevels,      ...override.tradeLevels },\n        tradePanel:       { ...base.tradePanel,       ...override.tradePanel },\n        drawing:          mergeDrawingTheme(base.drawing, override.drawing),\n    };\n}\n\n/**\n * Per-drawing-type style merge: each drawing type's style is shallow-merged\n * (override wins per field) on top of the base theme entry. Drawing types not\n * mentioned in `override` retain the full base entry.\n */\nfunction mergeDrawingTheme(\n    base: DrawingThemeMap,\n    override: DeepPartial<DrawingThemeMap> | undefined,\n): DrawingThemeMap {\n    if (!override) return base;\n    const result = { ...base };\n    for (const key of Object.keys(override) as DrawingToolType[]) {\n        const o = override[key];\n        if (!o) continue;\n        result[key] = { ...base[key], ...o } as AnyDrawingStyle;\n    }\n    return result;\n}\n\n/**\n * Walk every color string in `theme` and resolve any `var(--…)` CSS custom\n * properties to a concrete color value using the provided container element.\n * Non-variable strings are returned unchanged.\n *\n * Must be called after the container is appended to the live DOM so that the\n * browser can look up the custom property inheritance chain.\n */\nexport function resolveCssVarsInTheme(\n    theme: ChartTheme,\n    container: HTMLElement,\n): ChartTheme {\n    const tmp = document.createElement('div');\n    tmp.style.display = 'none';\n    container.appendChild(tmp);\n\n    const resolve = (value: string): string => {\n        if (!value.includes('var(')) return value;\n        // Convert legacy rgba(var(...), alpha) → CSS4 rgb(var(...) / alpha)\n        value = value.replace(\n            /rgba\\(\\s*(var\\([^)]+\\))\\s*,\\s*([0-9.]+)\\s*\\)/g,\n            'rgb($1 / $2)',\n        );\n        tmp.style.color = '';           // reset to detect failures\n        tmp.style.color = value;\n        const resolved = getComputedStyle(tmp).color;\n        return resolved || value;\n    };\n\n    const result: ChartTheme = {\n        background: resolve(theme.background),\n        grid:       resolve(theme.grid),\n        axisText:   resolve(theme.axisText),\n        axisBorder: resolve(theme.axisBorder),\n        crosshair:  resolve(theme.crosshair),\n        tooltip: {\n            background: resolve(theme.tooltip.background),\n            text:       resolve(theme.tooltip.text),\n            border:     resolve(theme.tooltip.border),\n        },\n        candle: {\n            up:       resolve(theme.candle.up),\n            down:     resolve(theme.candle.down),\n            wickUp:   resolve(theme.candle.wickUp),\n            wickDown: resolve(theme.candle.wickDown),\n            ...(theme.candle.borderUp   !== undefined && { borderUp:   resolve(theme.candle.borderUp) }),\n            ...(theme.candle.borderDown !== undefined && { borderDown: resolve(theme.candle.borderDown) }),\n        },\n        volume: {\n            up:   resolve(theme.volume.up),\n            down: resolve(theme.volume.down),\n        },\n        ui: {\n            accent:         resolve(theme.ui.accent),\n            accentText:     resolve(theme.ui.accentText),\n            accentBg:       resolve(theme.ui.accentBg),\n            accentBgStrong: resolve(theme.ui.accentBgStrong),\n            disabledText:   resolve(theme.ui.disabledText),\n            soonBadgeText:  resolve(theme.ui.soonBadgeText),\n            stream: {\n                connected:    resolve(theme.ui.stream.connected),\n                reconnecting: resolve(theme.ui.stream.reconnecting),\n                disconnected: resolve(theme.ui.stream.disconnected),\n            },\n        },\n        drawingToolbar: {\n            iconColor:          resolve(theme.drawingToolbar.iconColor),\n            activeIconColor:    resolve(theme.drawingToolbar.activeIconColor),\n            flyoutLabelColor:   resolve(theme.drawingToolbar.flyoutLabelColor),\n            flyoutHeadingColor: resolve(theme.drawingToolbar.flyoutHeadingColor),\n        },\n        topBar: {\n            btnColor:            resolve(theme.topBar.btnColor),\n            activeBtnColor:      resolve(theme.topBar.activeBtnColor),\n            flyoutRowColor:      resolve(theme.topBar.flyoutRowColor),\n            flyoutCategoryColor: resolve(theme.topBar.flyoutCategoryColor),\n        },\n        bottomBar: {\n            btnColor:        resolve(theme.bottomBar.btnColor),\n            activeBtnBg:     resolve(theme.bottomBar.activeBtnBg),\n            activeBtnText:   resolve(theme.bottomBar.activeBtnText),\n            activeBtnBorder: resolve(theme.bottomBar.activeBtnBorder),\n        },\n        indicatorOverlay: {\n            pillBg:          resolve(theme.indicatorOverlay.pillBg),\n            iconColor:       resolve(theme.indicatorOverlay.iconColor),\n            dropdownHoverBg: resolve(theme.indicatorOverlay.dropdownHoverBg),\n        },\n        tradeLevels: {\n            buySide:         resolve(theme.tradeLevels.buySide),\n            sellSide:        resolve(theme.tradeLevels.sellSide),\n            tradeLine:       resolve(theme.tradeLevels.tradeLine),\n            positionLine:    resolve(theme.tradeLevels.positionLine),\n            pendingBuyLine:  resolve(theme.tradeLevels.pendingBuyLine),\n            pendingSellLine: resolve(theme.tradeLevels.pendingSellLine),\n            labelText:       resolve(theme.tradeLevels.labelText),\n            closeBtn:        resolve(theme.tradeLevels.closeBtn),\n            closeBtnText:    resolve(theme.tradeLevels.closeBtnText),\n            boxBg:           resolve(theme.tradeLevels.boxBg),\n            boxBgHover:      resolve(theme.tradeLevels.boxBgHover),\n            dragHandle:      resolve(theme.tradeLevels.dragHandle),\n            dragHandleHover: resolve(theme.tradeLevels.dragHandleHover),\n        },\n        tradePanel: {\n            background:  resolve(theme.tradePanel.background),\n            border:      resolve(theme.tradePanel.border),\n            headerBg:    resolve(theme.tradePanel.headerBg),\n            tabActive:   resolve(theme.tradePanel.tabActive),\n            tabInactive: resolve(theme.tradePanel.tabInactive),\n            rowHoverBg:  resolve(theme.tradePanel.rowHoverBg),\n            rowText:     resolve(theme.tradePanel.rowText),\n            rowSubText:  resolve(theme.tradePanel.rowSubText),\n        },\n        drawing: resolveDrawingThemeVars(theme.drawing, resolve),\n    };\n\n    container.removeChild(tmp);\n    return result;\n}\n\n/** Resolves CSS-variable color strings inside the drawing theme map. */\nfunction resolveDrawingThemeVars(\n    drawing: DrawingThemeMap,\n    resolve: (value: string) => string,\n): DrawingThemeMap {\n    const out = {} as DrawingThemeMap;\n    for (const key of Object.keys(drawing) as DrawingToolType[]) {\n        const entry = drawing[key];\n        const resolved: AnyDrawingStyle = { ...entry };\n        if (resolved.strokeColor) resolved.strokeColor = resolve(resolved.strokeColor);\n        if (resolved.fillColor)   resolved.fillColor   = resolve(resolved.fillColor);\n        if ('textColor' in resolved && resolved.textColor) {\n            resolved.textColor = resolve(resolved.textColor);\n        }\n        if ('levels' in resolved && resolved.levels) {\n            const levels: Record<string, { visible: boolean; color: string }> = {};\n            for (const lk of Object.keys(resolved.levels)) {\n                const lv = resolved.levels[lk];\n                levels[lk] = { ...lv, color: resolve(lv.color) };\n            }\n            resolved.levels = levels;\n        }\n        out[key] = resolved;\n    }\n    return out;\n}\n\n// ── Drawing theme defaults ────────────────────────────────────────────────────\n\n/**\n * Default per-instance style values used when an `IDrawing` has no `style`\n * override. Colors mirror the values currently hardcoded inside each drawing's\n * `render()` so that introducing the theme map preserves existing visuals.\n *\n * Light/dark variants currently share the same defaults because today's\n * drawing classes don't branch on theme. PR 2-4 can split them as each\n * drawing's `render()` is rewritten to read from theme.\n */\nexport const DEFAULT_DRAWING_THEME: DrawingThemeMap = {\n    // ── Lines ────────────────────────────────────────────────────────────────\n    horizontalLine:  { strokeColor: '#e8b84b', lineWidth: 1, lineStyle: 'dashed' },\n    verticalLine:    { strokeColor: '#e8b84b', lineWidth: 1, lineStyle: 'dashed' },\n    trendLine:       { strokeColor: '#26c6da', lineWidth: 1, lineStyle: 'solid' },\n    crossLine:       { strokeColor: '#78909c', lineWidth: 1, lineStyle: 'dashed' },\n    trendAngle:      { strokeColor: '#26c6da', lineWidth: 1, lineStyle: 'solid' },\n\n    // ── Channels ────────────────────────────────────────────────────────────\n    flatChannel:     { strokeColor: '#ab47bc', lineWidth: 1, lineStyle: 'solid', fillColor: '#ab47bc', fillOpacity: 0.08 },\n    parallelChannel: { strokeColor: '#26c6da', lineWidth: 1, lineStyle: 'solid', fillColor: '#26c6da', fillOpacity: 0.08 },\n    disjointChannel: { strokeColor: '#ef9a9a', lineWidth: 1, lineStyle: 'solid' },\n\n    // ── Pitchfork family ────────────────────────────────────────────────────\n    pitchfork:       { strokeColor: '#ffa726', lineWidth: 1, lineStyle: 'solid' },\n    schiffPitchfork: { strokeColor: '#ff7043', lineWidth: 1, lineStyle: 'solid' },\n    modifiedSchiff:  { strokeColor: '#ef5350', lineWidth: 1, lineStyle: 'solid' },\n    insidePitchfork: { strokeColor: '#ab47bc', lineWidth: 1, lineStyle: 'solid' },\n\n    // ── Fib family (multi-level) ────────────────────────────────────────────\n    fibRetracement: {\n        lineWidth: 1, lineStyle: 'dashed',\n        levels: {\n            '0':     { visible: true, color: '#ef5350' },\n            '0.236': { visible: true, color: '#e8b84b' },\n            '0.382': { visible: true, color: '#26a69a' },\n            '0.5':   { visible: true, color: '#2196f3' },\n            '0.618': { visible: true, color: '#26a69a' },\n            '0.786': { visible: true, color: '#e8b84b' },\n            '1':     { visible: true, color: '#ef5350' },\n        },\n    } satisfies AnyDrawingStyle,\n    fibExtension: {\n        lineWidth: 1, lineStyle: 'dashed',\n        levels: {\n            '0':     { visible: true, color: '#888888' },\n            '0.618': { visible: true, color: '#26a69a' },\n            '1':     { visible: true, color: '#888888' },\n            '1.272': { visible: true, color: '#2196f3' },\n            '1.618': { visible: true, color: '#e8b84b' },\n            '2':     { visible: true, color: '#ef5350' },\n            '2.618': { visible: true, color: '#ef5350' },\n        },\n    } satisfies AnyDrawingStyle,\n    fibProjection: {\n        lineWidth: 1, lineStyle: 'dashed',\n        levels: {\n            '0':     { visible: true, color: '#ef5350' },\n            '0.618': { visible: true, color: '#26a69a' },\n            '1':     { visible: true, color: '#2196f3' },\n            '1.272': { visible: true, color: '#26a69a' },\n            '1.618': { visible: true, color: '#e8b84b' },\n            '2':     { visible: true, color: '#ef5350' },\n            '2.618': { visible: true, color: '#ef5350' },\n        },\n    } satisfies AnyDrawingStyle,\n    fibChannel:   { strokeColor: '#888888', lineWidth: 1, lineStyle: 'dashed' },\n    fibFan:       { strokeColor: '#888888', lineWidth: 1, lineStyle: 'dashed' },\n    fibCircles:   { strokeColor: '#e8b84b', lineWidth: 1, lineStyle: 'dashed' },\n    fibSpiral:    { strokeColor: '#e8b84b', lineWidth: 1, lineStyle: 'solid' },\n    fibTimezone:  { strokeColor: '#e8b84b', lineWidth: 1, lineStyle: 'dashed' },\n\n    // ── Geometric shapes ────────────────────────────────────────────────────\n    rectangle:        { strokeColor: '#9b59b6', lineWidth: 1, lineStyle: 'solid', fillColor: '#9b59b6', fillOpacity: 0.09 },\n    rotatedRectangle: { strokeColor: '#9c27b0', lineWidth: 1, lineStyle: 'solid', fillColor: '#9c27b0', fillOpacity: 0.09 },\n    ellipse:          { strokeColor: '#2196f3', lineWidth: 1, lineStyle: 'solid', fillColor: '#2196f3', fillOpacity: 0.08 },\n    circle:           { strokeColor: '#4caf50', lineWidth: 1, lineStyle: 'solid', fillColor: '#4caf50', fillOpacity: 0.08 },\n    triangle:         { strokeColor: '#ff9800', lineWidth: 1, lineStyle: 'solid', fillColor: '#ff9800', fillOpacity: 0.08 },\n    arc:              { strokeColor: '#26c6da', lineWidth: 1, lineStyle: 'solid' },\n    sineLine:         { strokeColor: '#ce93d8', lineWidth: 1, lineStyle: 'solid' },\n    path:             { strokeColor: '#ec407a', lineWidth: 1, lineStyle: 'solid' },\n    polyline:         { strokeColor: '#ff7043', lineWidth: 1, lineStyle: 'solid' },\n\n    // ── Brush / Highlighter ─────────────────────────────────────────────────\n    brush:       { strokeColor: '#ff5722', lineWidth: 2, lineStyle: 'solid' },\n    highlighter: { strokeColor: '#ffeb3b', lineWidth: 8, lineStyle: 'solid', fillOpacity: 0.4 },\n\n    // ── Text-bearing ────────────────────────────────────────────────────────\n    text:         { textColor: '#f5f5f5', fontSize: 13, strokeColor: '#2196f3' } satisfies AnyDrawingStyle,\n    callout:      { textColor: '#f5f5f5', fontSize: 13, strokeColor: '#546e7a', fillColor: '#546e7a', fillOpacity: 0.18 } satisfies AnyDrawingStyle,\n    priceLabel:   { textColor: '#ffffff', fontSize: 11, strokeColor: '#26a69a', fillColor: '#26a69a', fillOpacity: 1 } satisfies AnyDrawingStyle,\n    priceNote:    { textColor: '#f5f5f5', fontSize: 12, strokeColor: '#ffa726' } satisfies AnyDrawingStyle,\n    anchoredNote: { textColor: '#f5f5f5', fontSize: 12, strokeColor: '#42a5f5' } satisfies AnyDrawingStyle,\n\n    // ── Arrows / Markers ────────────────────────────────────────────────────\n    arrowUp:     { strokeColor: '#26a69a', lineWidth: 1.5, fillColor: '#26a69a', fillOpacity: 1 },\n    arrowDown:   { strokeColor: '#ef5350', lineWidth: 1.5, fillColor: '#ef5350', fillOpacity: 1 },\n    arrowMarker: { strokeColor: '#ef5350', lineWidth: 1.5, fillColor: '#ef5350', fillOpacity: 1 },\n    flag:        { strokeColor: '#ef5350', lineWidth: 1, fillColor: '#ef5350', fillOpacity: 0.85 },\n\n    // ── Volume profile ──────────────────────────────────────────────────────\n    volumeProfile: { strokeColor: '#26c6da', lineWidth: 1, fillColor: '#26c6da', fillOpacity: 0.35 },\n    anchoredVP:    { strokeColor: '#42a5f5', lineWidth: 1, fillColor: '#42a5f5', fillOpacity: 0.35 },\n    fixedRangeVP:  { strokeColor: '#7e57c2', lineWidth: 1, fillColor: '#7e57c2', fillOpacity: 0.35 },\n\n    // ── Harmonic patterns ───────────────────────────────────────────────────\n    abcdPattern:      { strokeColor: '#26c6da', lineWidth: 1, lineStyle: 'solid' },\n    gartleyPattern:   { strokeColor: '#26c6da', lineWidth: 1, lineStyle: 'solid' },\n    batPattern:       { strokeColor: '#26c6da', lineWidth: 1, lineStyle: 'solid' },\n    butterflyPattern: { strokeColor: '#26c6da', lineWidth: 1, lineStyle: 'solid' },\n    crabPattern:      { strokeColor: '#26c6da', lineWidth: 1, lineStyle: 'solid' },\n    sharkPattern:     { strokeColor: '#26c6da', lineWidth: 1, lineStyle: 'solid' },\n    cypherPattern:    { strokeColor: '#26c6da', lineWidth: 1, lineStyle: 'solid' },\n    headShoulders:    { strokeColor: '#26c6da', lineWidth: 1, lineStyle: 'solid' },\n    trianglePattern:  { strokeColor: '#26c6da', lineWidth: 1, lineStyle: 'solid' },\n    threeDrives:      { strokeColor: '#26c6da', lineWidth: 1, lineStyle: 'solid' },\n\n    // ── Elliott waves ───────────────────────────────────────────────────────\n    elliottImpulse:     { strokeColor: '#42a5f5', lineWidth: 1, lineStyle: 'solid' },\n    elliottCorrective:  { strokeColor: '#42a5f5', lineWidth: 1, lineStyle: 'solid' },\n    elliottTriangle:    { strokeColor: '#42a5f5', lineWidth: 1, lineStyle: 'solid' },\n    elliottWxy:         { strokeColor: '#42a5f5', lineWidth: 1, lineStyle: 'solid' },\n    elliottCombination: { strokeColor: '#42a5f5', lineWidth: 1, lineStyle: 'solid' },\n\n    // ── Gann ────────────────────────────────────────────────────────────────\n    gannFan:    { strokeColor: '#ffa726', lineWidth: 1, lineStyle: 'solid' },\n    gannSquare: { strokeColor: '#ab47bc', lineWidth: 1, lineStyle: 'solid' },\n    gannBox:    { strokeColor: '#7e57c2', lineWidth: 1, lineStyle: 'solid' },\n\n    // ── Measurement ─────────────────────────────────────────────────────────\n    priceRange:     { strokeColor: '#66bb6a', lineWidth: 1, fillColor: '#66bb6a', fillOpacity: 0.07 },\n    dateRange:      { strokeColor: '#66bb6a', lineWidth: 1, fillColor: '#66bb6a', fillOpacity: 0.07 },\n    datePriceRange: { strokeColor: '#66bb6a', lineWidth: 1, fillColor: '#66bb6a', fillOpacity: 0.07 },\n    ruler:          { strokeColor: '#90a4ae', lineWidth: 1, lineStyle: 'dashed' },\n\n    // ── Advanced ────────────────────────────────────────────────────────────\n    regressionTrend:  { strokeColor: '#42a5f5', lineWidth: 1, lineStyle: 'solid' },\n    projection:       { strokeColor: '#9575cd', lineWidth: 1, lineStyle: 'dashed' },\n    cyclicLines:      { strokeColor: '#80cbc4', lineWidth: 1, lineStyle: 'dashed' },\n    timeCycles:       { strokeColor: '#80cbc4', lineWidth: 1, lineStyle: 'dashed', fillColor: '#80cbc4', fillOpacity: 0.06 },\n    priceProjection:  { strokeColor: '#ef9a9a', lineWidth: 1, lineStyle: 'dashed', fillColor: '#ef9a9a', fillOpacity: 0.09 },\n    ghostFeed:        { strokeColor: '#9e9e9e', lineWidth: 1, lineStyle: 'dotted' },\n};\n\n// ── Dark theme ────────────────────────────────────────────────────────────────\n\nexport const DARK_THEME: ChartTheme = {\n    background: '#141d22',\n    grid: '#243344',\n    axisText: '#a8bac8',\n    axisBorder: '#1c2a35',\n    crosshair: 'rgba(255,255,255,0.4)',\n    tooltip: { background: '#1c2a35', text: '#e8eef2', border: '#1c2a35' },\n    candle: { up: '#5caf79', down: '#DF6868', wickUp: '#5caf79', wickDown: '#DF6868' },\n    volume: { up: 'rgba(92,175,121,0.4)', down: 'rgba(223,104,104,0.4)' },\n\n    ui: {\n        accent: '#398dff',\n        accentText: '#93bcff',\n        accentBg: 'rgba(57,141,255,0.15)',\n        accentBgStrong: 'rgba(57,141,255,0.22)',\n        disabledText: '#484f58',\n        soonBadgeText: '#30363d',\n        stream: {\n            connected: '#5caf79',\n            reconnecting: '#e8b84b',\n            disconnected: '#555555',\n        },\n    },\n\n    drawingToolbar: {\n        iconColor: '#e8eef2', // tooltip.text equivalent\n        activeIconColor: '#93bcff',\n        flyoutLabelColor: '#a8bac8', // axisText\n        flyoutHeadingColor: '#a8bac8',\n    },\n\n    topBar: {\n        btnColor: '#a8bac8',\n        activeBtnColor: '#93bcff',\n        flyoutRowColor: '#a8bac8',\n        flyoutCategoryColor: '#a8bac8',\n    },\n\n    bottomBar: {\n        btnColor: '#a8bac8',\n        activeBtnBg: '#5caf79', // candle.up\n        activeBtnText: '#ffffff',\n        activeBtnBorder: '#5caf79',\n    },\n\n    indicatorOverlay: {\n        pillBg: 'rgba(28,42,53,0.73)', // tooltip.background + alpha\n        iconColor: '#a8bac8',\n        dropdownHoverBg: '#1c2a35',\n    },\n\n    tradeLevels: {\n        buySide:  '#26a69a',\n        sellSide: '#ef5350',\n        tradeLine: '#5caf79',\n        positionLine: '#7b61ff',\n        pendingBuyLine: 'rgba(92,175,121,0.75)',\n        pendingSellLine: 'rgba(223,104,104,0.75)',\n        labelText: '#ffffff',\n        closeBtn: 'rgba(255,255,255,0.18)',\n        closeBtnText: '#ffffff',\n        boxBg: 'rgba(20, 24, 36, 0.92)',\n        boxBgHover: 'rgba(35, 40, 58, 0.97)',\n        dragHandle: 'rgba(255,255,255,0.3)',\n        dragHandleHover: '#9ca3af',\n    },\n\n    tradePanel: {\n        background: '#1c2a35',\n        border: '#243344',\n        headerBg: '#151f28',\n        tabActive: '#93bcff',\n        tabInactive: '#a8bac8',\n        rowHoverBg: 'rgba(255,255,255,0.04)',\n        rowText: '#e8eef2',\n        rowSubText: '#9ca3af',\n    },\n\n    drawing: DEFAULT_DRAWING_THEME,\n};\n\n// ── Light theme ───────────────────────────────────────────────────────────────\n\nexport const LIGHT_THEME: ChartTheme = {\n    background: '#ffffff',\n    grid: '#efefef',\n    axisText: '#666666',\n    axisBorder: '#cccccc',\n    crosshair: '#999999',\n    tooltip: { background: '#f8f8f8', text: '#333333', border: '#cccccc' },\n    candle: { up: '#5caf79', down: '#DF6868', wickUp: '#5caf79', wickDown: '#DF6868' },\n    volume: { up: 'rgba(92,175,121,0.6)', down: 'rgba(223,104,104,0.6)' },\n\n    ui: {\n        accent: '#398dff',\n        accentText: '#2a7aff',\n        accentBg: 'rgba(57,141,255,0.10)',\n        accentBgStrong: 'rgba(57,141,255,0.18)',\n        disabledText: '#94a3b8',\n        soonBadgeText: '#cbd5e1',\n        stream: {\n            connected: '#5caf79',\n            reconnecting: '#d97706',\n            disconnected: '#94a3b8',\n        },\n    },\n\n    drawingToolbar: {\n        iconColor: '#333333', // tooltip.text\n        activeIconColor: '#398dff',\n        flyoutLabelColor: '#666666',\n        flyoutHeadingColor: '#666666',\n    },\n\n    topBar: {\n        btnColor: '#666666',\n        activeBtnColor: '#398dff',\n        flyoutRowColor: '#666666',\n        flyoutCategoryColor: '#666666',\n    },\n\n    bottomBar: {\n        btnColor: '#666666',\n        activeBtnBg: '#5caf79', // candle.up\n        activeBtnText: '#ffffff',\n        activeBtnBorder: '#5caf79',\n    },\n\n    indicatorOverlay: {\n        pillBg: 'rgba(248,248,248,0.85)', // tooltip.background + alpha\n        iconColor: '#666666',\n        dropdownHoverBg: '#f0f0f0',\n    },\n\n    tradeLevels: {\n        buySide:  '#26a69a',\n        sellSide: '#ef5350',\n        tradeLine: '#5caf79',\n        positionLine: '#6d28d9',\n        pendingBuyLine: 'rgba(92,175,121,0.75)',\n        pendingSellLine: 'rgba(223,104,104,0.75)',\n        labelText: '#ffffff',\n        closeBtn: 'rgba(0,0,0,0.15)',\n        closeBtnText: '#ffffff',\n        boxBg: 'rgba(240, 244, 252, 0.95)',\n        boxBgHover: 'rgba(255, 255, 255, 0.99)',\n        dragHandle: '#94a3b8',\n        dragHandleHover: '#475569',\n    },\n\n    tradePanel: {\n        background: '#f8f8f8',\n        border: '#cccccc',\n        headerBg: '#f0f0f0',\n        tabActive: '#398dff',\n        tabInactive: '#666666',\n        rowHoverBg: 'rgba(0,0,0,0.03)',\n        rowText: '#333333',\n        rowSubText: '#666666',\n    },\n\n    drawing: DEFAULT_DRAWING_THEME,\n};\n","// ── Per-component UI configuration ────────────────────────────────────────────\n//\n// Non-color values only (sizes, fonts, spacing).\n// Colors live in ChartTheme (themes.ts) under the `ui` and component-specific\n// sub-keys so they can be swapped per theme.\n//\n// Each section is intentionally independent — a drawing-toolbar label and an\n// indicator-pill label may share the same numeric value by coincidence but are\n// separate properties so either can be changed without affecting the other.\n\n// ── Drawing Toolbar (LeftBar) ─────────────────────────────────────────────────\n\nexport interface DrawingToolbarUiConfig {\n    /** Icon button size (width = height) in px */\n    iconBtnSize: number;\n    /** Font size for unicode icons inside category buttons */\n    iconFontSize: string;\n    /** Font family for icon buttons */\n    iconFontFamily: string;\n    /** Font size for tool-name labels inside the category flyout */\n    flyoutLabelFontSize: string;\n    /** Font family for flyout tool labels */\n    flyoutLabelFontFamily: string;\n    /** Font size for keyboard shortcut hints in flyout rows */\n    shortcutFontSize: string;\n    /** Font size for \"soon\" badges in flyout rows */\n    soonBadgeFontSize: string;\n    /** Font size for the category-group header inside flyouts */\n    flyoutHeadingFontSize: string;\n    /** Letter-spacing for flyout group headings */\n    flyoutHeadingLetterSpacing: string;\n    /** Height of the scroll-up / scroll-down indicator buttons in px */\n    scrollBtnHeight: number;\n    /** Font size for scroll indicator arrow glyphs */\n    scrollBtnFontSize: string;\n    /** Horizontal padding inside the sidebar bar in px */\n    barPadding: number;\n    /** Gap between icon buttons in the grid in px */\n    btnGap: number;\n    /** Container width (px) below which LeftBar switches to mobile layout */\n    mobileBreakpoint: number;\n}\n\n// ── Top Bar ───────────────────────────────────────────────────────────────────\n\nexport interface TopBarUiConfig {\n    /** Height of the top bar strip */\n    height: string;\n    /** Font size for series / timeframe / indicator dropdown buttons */\n    dropBtnFontSize: string;\n    /** Font family for dropdown buttons */\n    dropBtnFontFamily: string;\n    /** Size (width = height) of the drawing-mode toggle button */\n    drawBtnSize: string;\n    /** Font size for the icon inside the drawing toggle button */\n    drawBtnIconFontSize: string;\n    /** Size (width = height) of icon-only buttons (settings, fullscreen) — desktop */\n    iconBtnSize: string;\n    /** Size (width = height) of icon-only buttons — mobile override */\n    mobileIconBtnSize: string;\n    /** SVG icon dimension inside the drawing toggle button — mobile override */\n    mobileDrawBtnIconSize: string;\n    /** Font size for flyout list rows */\n    flyoutRowFontSize: string;\n    /** Font family for flyout list rows */\n    flyoutRowFontFamily: string;\n    /** Font size for flyout group-category headers */\n    flyoutCategoryFontSize: string;\n    /** Letter-spacing for flyout category headers */\n    flyoutCategoryLetterSpacing: string;\n    /** Checkmark icon font size inside flyout active rows */\n    flyoutCheckFontSize: string;\n    /** Diameter of the stream-status dot indicator */\n    streamDotSize: string;\n}\n\n// ── Bottom Bar ────────────────────────────────────────────────────────────────\n\nexport interface BottomBarUiConfig {\n    /** Height of the bottom bar strip */\n    height: string;\n    /** Font size for duration selector buttons (1D, 5D, 1M …) */\n    btnFontSize: string;\n    /** Font family for duration buttons */\n    btnFontFamily: string;\n}\n\n// ── Price Axis (Y-axis) ───────────────────────────────────────────────────────\n\nexport interface PriceAxisUiConfig {\n    /** Font size for price tick labels */\n    fontSize: string;\n    /** Font family for price tick labels */\n    fontFamily: string;\n}\n\n// ── Time Axis (X-axis) ────────────────────────────────────────────────────────\n\nexport interface TimeAxisUiConfig {\n    /** Font size for time tick labels */\n    fontSize: string;\n    /** Font family for time tick labels */\n    fontFamily: string;\n}\n\n// ── Crosshair overlay ─────────────────────────────────────────────────────────\n\nexport interface CrosshairUiConfig {\n    /** Height of the price-tag label drawn on the Y-axis in px */\n    labelHeight: number;\n    /** Horizontal padding inside the price-tag label in px */\n    labelPaddingX: number;\n    /** Font size for price and time labels */\n    fontSize: string;\n    /** Font family for price and time labels */\n    fontFamily: string;\n}\n\n// ── Indicator Overlay (pills above the chart) ─────────────────────────────────\n\nexport interface IndicatorOverlayUiConfig {\n    /** Font size for inline indicator pill labels */\n    pillFontSize: string;\n    /** Font family for inline indicator pills */\n    pillFontFamily: string;\n    /** Font size for the colour-dot glyph inside pills */\n    dotFontSize: string;\n    /** Font size for gear ⚙ and remove ✕ icons inside inline pills */\n    pillIconFontSize: string;\n    /** Font size for the \"N indicators\" collapse toggle button */\n    collapseBtnFontSize: string;\n    /** Font family for the collapse toggle button */\n    collapseBtnFontFamily: string;\n    /** Font size for rows inside the collapsed dropdown panel */\n    dropdownRowFontSize: string;\n    /** Font family for dropdown rows */\n    dropdownRowFontFamily: string;\n    /** Font size for gear ⚙ and remove ✕ icons inside dropdown rows */\n    dropdownIconFontSize: string;\n}\n\n// ── Trade Button (floating ⊕) ────────────────────────────────────────────────\n\nexport interface TradeButtonUiConfig {\n    /** Button diameter (px) — desktop */\n    size: number;\n    /** Button diameter (px) — mobile override */\n    mobileSize: number;\n    /** SVG icon dimension (px) — desktop */\n    iconSize: number;\n    /** SVG icon dimension (px) — mobile override */\n    mobileIconSize: number;\n}\n\n// ── Aggregated full UI config ─────────────────────────────────────────────────\n\nexport interface UiConfig {\n    drawingToolbar:   DrawingToolbarUiConfig;\n    topBar:           TopBarUiConfig;\n    bottomBar:        BottomBarUiConfig;\n    priceAxis:        PriceAxisUiConfig;\n    timeAxis:         TimeAxisUiConfig;\n    crosshair:        CrosshairUiConfig;\n    indicatorOverlay: IndicatorOverlayUiConfig;\n    tradeButton:      TradeButtonUiConfig;\n}\n\n// ── Default values ────────────────────────────────────────────────────────────\n\nconst INTER_FONT = \"'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\";\n\nexport const DEFAULT_DRAWING_TOOLBAR_CONFIG: DrawingToolbarUiConfig = {\n    iconBtnSize:                 40,\n    iconFontSize:                '20px',\n    iconFontFamily:              INTER_FONT,\n    flyoutLabelFontSize:         '12px',\n    flyoutLabelFontFamily:       INTER_FONT,\n    shortcutFontSize:            '9px',\n    soonBadgeFontSize:           '9px',\n    flyoutHeadingFontSize:       '10px',\n    flyoutHeadingLetterSpacing:  '0.08em',\n    scrollBtnHeight:             20,\n    scrollBtnFontSize:           '9px',\n    barPadding:                  7,\n    btnGap:                      4,\n    mobileBreakpoint:            480,\n};\n\nexport const DEFAULT_TOP_BAR_CONFIG: TopBarUiConfig = {\n    height:                       '36px',\n    dropBtnFontSize:              '11px',\n    dropBtnFontFamily:            INTER_FONT,\n    drawBtnSize:                  '26px',\n    drawBtnIconFontSize:          '14px',\n    iconBtnSize:                  '26px',\n    mobileIconBtnSize:            '28px',\n    mobileDrawBtnIconSize:        '16px',\n    flyoutRowFontSize:            '12px',\n    flyoutRowFontFamily:          INTER_FONT,\n    flyoutCategoryFontSize:       '10px',\n    flyoutCategoryLetterSpacing:  '0.08em',\n    flyoutCheckFontSize:          '11px',\n    streamDotSize:                '7px',\n};\n\nexport const DEFAULT_BOTTOM_BAR_CONFIG: BottomBarUiConfig = {\n    height:        '32px',\n    btnFontSize:   '11px',\n    btnFontFamily: INTER_FONT,\n};\n\nexport const DEFAULT_PRICE_AXIS_CONFIG: PriceAxisUiConfig = {\n    fontSize:   '11px',\n    fontFamily: INTER_FONT,\n};\n\nexport const DEFAULT_TIME_AXIS_CONFIG: TimeAxisUiConfig = {\n    fontSize:   '11px',\n    fontFamily: INTER_FONT,\n};\n\nexport const DEFAULT_CROSSHAIR_CONFIG: CrosshairUiConfig = {\n    labelHeight:   18,\n    labelPaddingX: 4,\n    fontSize:      '11px',\n    fontFamily:    INTER_FONT,\n};\n\nexport const DEFAULT_INDICATOR_OVERLAY_CONFIG: IndicatorOverlayUiConfig = {\n    pillFontSize:          '13px',\n    pillFontFamily:        INTER_FONT,\n    dotFontSize:           '8px',\n    pillIconFontSize:      '12px',\n    collapseBtnFontSize:   '13px',\n    collapseBtnFontFamily: INTER_FONT,\n    dropdownRowFontSize:   '11px',\n    dropdownRowFontFamily: INTER_FONT,\n    dropdownIconFontSize:  '10px',\n};\n\nexport const DEFAULT_TRADE_BUTTON_CONFIG: TradeButtonUiConfig = {\n    size:            22,\n    mobileSize:      24,\n    iconSize:        14,\n    mobileIconSize:  16,\n};\n\nexport const DEFAULT_UI_CONFIG: UiConfig = {\n    drawingToolbar:   DEFAULT_DRAWING_TOOLBAR_CONFIG,\n    topBar:           DEFAULT_TOP_BAR_CONFIG,\n    bottomBar:        DEFAULT_BOTTOM_BAR_CONFIG,\n    priceAxis:        DEFAULT_PRICE_AXIS_CONFIG,\n    timeAxis:         DEFAULT_TIME_AXIS_CONFIG,\n    crosshair:        DEFAULT_CROSSHAIR_CONFIG,\n    indicatorOverlay: DEFAULT_INDICATOR_OVERLAY_CONFIG,\n    tradeButton:      DEFAULT_TRADE_BUTTON_CONFIG,\n};\n\n// ── Deep-partial helper type ──────────────────────────────────────────────────\n\nexport type DeepPartial<T> = {\n    [K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];\n};\n\n/**\n * Merge a deep-partial user override on top of a full default config.\n * Only the top-level keys of `UiConfig` are merged — component configs\n * are replaced as a whole unit if provided (shallow merge per component).\n */\nexport function resolveUiConfig(override?: DeepPartial<UiConfig>): UiConfig {\n    if (!override) return DEFAULT_UI_CONFIG;\n    return {\n        drawingToolbar:   { ...DEFAULT_DRAWING_TOOLBAR_CONFIG,   ...override.drawingToolbar },\n        topBar:           { ...DEFAULT_TOP_BAR_CONFIG,           ...override.topBar },\n        bottomBar:        { ...DEFAULT_BOTTOM_BAR_CONFIG,        ...override.bottomBar },\n        priceAxis:        { ...DEFAULT_PRICE_AXIS_CONFIG,        ...override.priceAxis },\n        timeAxis:         { ...DEFAULT_TIME_AXIS_CONFIG,         ...override.timeAxis },\n        crosshair:        { ...DEFAULT_CROSSHAIR_CONFIG,         ...override.crosshair },\n        indicatorOverlay: { ...DEFAULT_INDICATOR_OVERLAY_CONFIG, ...override.indicatorOverlay },\n        tradeButton:      { ...DEFAULT_TRADE_BUTTON_CONFIG,      ...override.tradeButton },\n    };\n}\n","// ── User-visible UI string labels ─────────────────────────────────────────────\n//\n// All static text that appears in the chart UI is centralised here so that\n// consumer projects can supply their own translations without forking the library.\n//\n// Usage:\n//   import { DEFAULT_LABELS, resolveLabels } from 'acttrader-charts';\n//   const labels = resolveLabels({ trade: { buy: 'Acheter', sell: 'Vendre' } });\n//\n// In ChartConfig pass `labels` and the engine resolves it automatically:\n//   new ChartEngine({ ..., labels: { trade: { buy: 'Acheter' } } });\n//\n// Placeholder tokens:\n//   {count}  — replaced with the current count at render time\n//   {name}   — replaced with the indicator / level name at render time\n\nimport type { Timeframe, Duration, DrawingToolType } from './types.js';\nimport type { DeepPartial } from './uiConfig.js';\n\n// ── Top bar ───────────────────────────────────────────────────────────────────\n\nexport interface TopBarLabels {\n    /** Dropdown label for each series (chart) type. */\n    series: {\n        candlestick:   string;\n        hollow:        string;\n        ohlc:          string;\n        line:          string;\n        area:          string;\n        heikinashi:    string;\n        volumecandles: string;\n        linemarkers:   string;\n        step:          string;\n        hlcarea:       string;\n        baseline:      string;\n        columns:       string;\n        highlow:       string;\n    };\n    /** Timeframe dropdown button labels. */\n    timeframes: Record<Timeframe, string>;\n    /** Indicators button text when no indicators are active. */\n    indicatorsBtn: string;\n    /** Indicators button text when one or more indicators are active.\n     *  Use `{count}` as a placeholder for the active count. */\n    indicatorsBtnActive: string;\n    /** Tooltip on the drawing-toolbar toggle button. */\n    toggleDrawingTitle: string;\n    /** Tooltip on the fullscreen button when in normal mode. */\n    toggleFullscreenTitle: string;\n    /** Tooltip on the fullscreen button when already in fullscreen. */\n    exitFullscreenTitle: string;\n    /** Tooltip on the chart-settings button. */\n    settingsTitle: string;\n    /** Tooltip on the TFC (Trade from Charts) toggle button. */\n    tfcToggleTitle: string;\n}\n\n// ── Bottom bar ────────────────────────────────────────────────────────────────\n\nexport interface BottomBarLabels {\n    /** Duration selector button labels. */\n    durations: Record<Duration, string>;\n}\n\n// ── Drawing toolbar (LeftBar) ─────────────────────────────────────────────────\n\nexport interface DrawingToolbarLabels {\n    /** Category flyout heading labels. */\n    categories: {\n        trendLines: string;\n        fibonacci: string;\n        shapes: string;\n        measurements: string;\n        pitchforks: string;\n        volume: string;\n        annotations: string;\n        patterns: string;\n        elliott: string;\n        brushes: string;\n        advanced: string;\n        priceProjection: string;\n    };\n    /** Individual drawing tool names (used in flyout rows). */\n    tools: Record<DrawingToolType, string>;\n    /** Action button tooltips at the bottom of the toolbar. */\n    actions: {\n        undo: string;\n        redo: string;\n        deleteSelected: string;\n        clearAll: string;\n        showAll: string;\n        hideAll: string;\n        lockAll: string;\n        unlockAll: string;\n        /** Tooltip for the combined actions button in mobile layout. */\n        moreActions: string;\n    };\n    /** Badge text shown on drawing tools that are not yet implemented. */\n    soonBadge: string;\n    /** Tooltip for the scroll-up indicator button. */\n    scrollUp: string;\n    /** Tooltip for the scroll-down indicator button. */\n    scrollDown: string;\n}\n\n// ── OHLC strip ────────────────────────────────────────────────────────────────\n\nexport interface OhlcLabels {\n    /** Label shown before the open price. */\n    open: string;\n    /** Label shown before the high price. */\n    high: string;\n    /** Label shown before the low price. */\n    low: string;\n    /** Label shown before the close price. */\n    close: string;\n    /** Label shown before the volume value. */\n    volume: string;\n}\n\n// ── Trade / TFC labels ────────────────────────────────────────────────────────\n\nexport interface TradeLabels {\n    /** Buy side label (trade button, order popover). */\n    buy: string;\n    /** Sell side label. */\n    sell: string;\n    /** Limit order type label. */\n    limit: string;\n    /** Stop order type label. */\n    stop: string;\n    /** Market order type label. */\n    market: string;\n    /** Separator word between order descriptor and price (e.g. \"at\"). */\n    at: string;\n    /** Quantity input label in the draft-order input. */\n    qty: string;\n    /** Tooltip on the floating trade button (⊕). */\n    placeOrderTitle: string;\n}\n\n// ── Dialogs ───────────────────────────────────────────────────────────────────\n\nexport interface DialogLabels {\n    /** Chart Settings dialog. */\n    settings: {\n        /** Dialog title bar text. */\n        title: string;\n        /** Section header for Trade from Charts settings. */\n        tfcSection: string;\n        /** Label for the trade-display-filter radio group. */\n        showLabel: string;\n        /** Label for the position render-style radio group. */\n        positionStyleLabel: string;\n        /** Radio option — show all levels. */\n        showAll: string;\n        /** Radio option — show positions only. */\n        showPositions: string;\n        /** Radio option — show pending orders only. */\n        showOrders: string;\n        /** Radio option — hide all trade levels. */\n        showNone: string;\n        /** Radio option — render positions as full horizontal lines. */\n        styleLine: string;\n        /** Radio option — render positions as dots on the price axis. */\n        styleDot: string;\n        /** Reset-to-defaults button label. */\n        resetBtn: string;\n    };\n    /** Indicator Settings dialog. */\n    indicator: {\n        /** Appended to the indicator name in the dialog title bar.\n         *  Rendered as \"{indicator name} {titleSuffix}\". */\n        titleSuffix: string;\n        /** Message shown when an indicator has no configurable parameters. */\n        noParams: string;\n    };\n}\n\n// ── Misc chart-level labels ───────────────────────────────────────────────────\n\nexport interface ChartMiscLabels {\n    /** Overlay text shown while data is being fetched. */\n    loading: string;\n    /** Overlay text shown when a completed fetch returned zero bars. */\n    noData: string;\n    /** Tooltip on the \"jump to live edge\" button. */\n    scrollToLatest: string;\n    /** Collapse button text in the indicator overlay when more than 2 indicators\n     *  are active.  Use `{count}` as a placeholder for the count. */\n    nIndicators: string;\n}\n\n// ── Root interface ────────────────────────────────────────────────────────────\n\nexport interface ChartLabels {\n    topBar:          TopBarLabels;\n    bottomBar:       BottomBarLabels;\n    drawingToolbar:  DrawingToolbarLabels;\n    ohlc:            OhlcLabels;\n    trade:           TradeLabels;\n    dialogs:         DialogLabels;\n    chart:           ChartMiscLabels;\n}\n\n// ── Default English labels ────────────────────────────────────────────────────\n\nexport const DEFAULT_LABELS: ChartLabels = {\n    topBar: {\n        series: {\n            candlestick:   'Candles',\n            hollow:        'Hollow',\n            ohlc:          'OHLC',\n            line:          'Line',\n            area:          'Area',\n            heikinashi:    'Heikin Ashi',\n            volumecandles: 'Volume Candles',\n            linemarkers:   'Line with Markers',\n            step:          'Step Line',\n            hlcarea:       'HLC Area',\n            baseline:      'Baseline',\n            columns:       'Columns',\n            highlow:       'High-low',\n        },\n        timeframes: {\n            '1m':  '1m',\n            '5m':  '5m',\n            '15m': '15m',\n            '30m': '30m',\n            '1h':  '1h',\n            '2h':  '2h',\n            '4h':  '4h',\n            '8h':  '8h',\n            '1D':  '1D',\n            '1W':  '1W',\n            '1M':  '1M',\n        },\n        indicatorsBtn:        'Indicators',\n        indicatorsBtnActive:  'Indicators ({count})',\n        toggleDrawingTitle:   'Toggle Drawing Tools',\n        toggleFullscreenTitle:'Toggle Fullscreen',\n        exitFullscreenTitle:  'Exit Fullscreen',\n        settingsTitle:        'Settings',\n        tfcToggleTitle:       'Trade from Charts',\n    },\n\n    bottomBar: {\n        durations: {\n            '1D':  '1D',\n            '5D':  '5D',\n            '1M':  '1M',\n            '3M':  '3M',\n            '6M':  '6M',\n            '1Y':  '1Y',\n            '5Y':  '5Y',\n            'All': 'All',\n        },\n    },\n\n    drawingToolbar: {\n        categories: {\n            trendLines:      'Trend Lines & Channels',\n            fibonacci:       'Fibonacci & Gann Tools',\n            shapes:          'Geometric Shapes',\n            measurements:    'Measurement Tools',\n            pitchforks:      'Pitchfork Tools',\n            volume:          'Volume & Statistical Tools',\n            annotations:     'Annotation Tools',\n            patterns:        'Pattern Recognition',\n            elliott:         'Elliott Wave Tools',\n            brushes:         'Brush & Highlighter',\n            advanced:        'Advanced Tools',\n            priceProjection: 'Price Projection Tools',\n        },\n        tools: {\n            horizontalLine:     'Horizontal Line',\n            verticalLine:       'Vertical Line',\n            trendLine:          'Trend Line',\n            trendAngle:         'Trend Angle',\n            crossLine:          'Cross Line',\n            parallelChannel:    'Parallel Channel',\n            flatChannel:        'Flat Top/Bottom Channel',\n            disjointChannel:    'Disjoint Channel',\n            fibRetracement:     'Fibonacci Retracement',\n            fibExtension:       'Fibonacci Extension',\n            fibChannel:         'Fibonacci Channel',\n            fibTimezone:        'Fibonacci Timezone',\n            fibCircles:         'Fibonacci Circles',\n            fibSpiral:          'Fibonacci Spiral',\n            fibFan:             'Fibonacci Speed Resistance Fan',\n            fibProjection:      'Fibonacci Projection',\n            gannFan:            'Gann Fan',\n            gannSquare:         'Gann Square',\n            gannBox:            'Gann Box',\n            rectangle:          'Rectangle',\n            rotatedRectangle:   'Rotated Rectangle',\n            ellipse:            'Ellipse',\n            triangle:           'Triangle',\n            circle:             'Circle',\n            arc:                'Arc',\n            polyline:           'Polyline',\n            path:               'Path',\n            priceRange:         'Price Range',\n            dateRange:          'Date Range',\n            datePriceRange:     'Date & Price Range',\n            ruler:              'Ruler',\n            pitchfork:          'Pitchfork',\n            schiffPitchfork:    'Schiff Pitchfork',\n            modifiedSchiff:     'Modified Schiff Pitchfork',\n            insidePitchfork:    'Inside Pitchfork',\n            fixedRangeVP:       'Fixed Range Volume Profile',\n            anchoredVP:         'Anchored Volume Profile',\n            volumeProfile:      'Volume Profile',\n            regressionTrend:    'Regression Trend',\n            text:               'Text',\n            callout:            'Callout',\n            priceLabel:         'Price Label',\n            arrowMarker:        'Arrow Marker',\n            flag:               'Flag',\n            priceNote:          'Price Note',\n            anchoredNote:       'Anchored Note',\n            arrowUp:            'Arrow Up',\n            arrowDown:          'Arrow Down',\n            headShoulders:      'Head & Shoulders',\n            trianglePattern:    'Triangle Pattern',\n            threeDrives:        '3 Drives Pattern',\n            abcdPattern:        'ABCD Pattern',\n            cypherPattern:      'Cypher Pattern',\n            butterflyPattern:   'Butterfly Pattern',\n            batPattern:         'Bat Pattern',\n            gartleyPattern:     'Gartley Pattern',\n            crabPattern:        'Crab Pattern',\n            sharkPattern:       'Shark Pattern',\n            elliottImpulse:     'Elliott Impulse (12345)',\n            elliottCorrective:  'Elliott Corrective (ABC)',\n            elliottTriangle:    'Elliott Wave Triangle',\n            elliottCombination: 'Elliott Wave Combination',\n            elliottWxy:         'Elliott Double Three (WXY)',\n            brush:              'Brush',\n            highlighter:        'Highlighter',\n            ghostFeed:          'Ghost Feed',\n            projection:         'Projection',\n            sineLine:           'Sine Line',\n            cyclicLines:        'Cyclic Lines',\n            timeCycles:         'Time Cycles',\n            priceProjection:    'Price Projection',\n        },\n        actions: {\n            undo:           'Undo (Ctrl+Z)',\n            redo:           'Redo (Ctrl+Y)',\n            deleteSelected: 'Delete Selected (Del)',\n            clearAll:       'Clear All',\n            showAll:        'Show All',\n            hideAll:        'Hide All',\n            lockAll:        'Lock All',\n            unlockAll:      'Unlock All',\n            moreActions:    'Actions',\n        },\n        soonBadge:   'soon',\n        scrollUp:    'Scroll up',\n        scrollDown:  'Scroll down',\n    },\n\n    ohlc: {\n        open:   'O',\n        high:   'H',\n        low:    'L',\n        close:  'C',\n        volume: 'V',\n    },\n\n    trade: {\n        buy:            'Buy',\n        sell:           'Sell',\n        limit:          'Limit',\n        stop:           'Stop',\n        market:         'Market',\n        at:             'at',\n        qty:            'Qty',\n        placeOrderTitle:'Place order at this price',\n    },\n\n    dialogs: {\n        settings: {\n            title:               'Chart Settings',\n            tfcSection:          'Trade from Charts',\n            showLabel:           'Show',\n            positionStyleLabel:  'Position Style',\n            showAll:             'All',\n            showPositions:       'Positions Only',\n            showOrders:          'Orders Only',\n            showNone:            'None',\n            styleLine:           'Full Line',\n            styleDot:            'Dot',\n            resetBtn:            'Reset to Defaults',\n        },\n        indicator: {\n            titleSuffix: 'Settings',\n            noParams:    'No configurable parameters.',\n        },\n    },\n\n    chart: {\n        loading:        'Loading\\u2026',   // 'Loading…'\n        noData:         'No data available',\n        scrollToLatest: 'Scroll to latest',\n        nIndicators:    '{count} indicators',\n    },\n};\n\n// ── Merge helper ──────────────────────────────────────────────────────────────\n\n/**\n * Deep-merges a partial labels override on top of `DEFAULT_LABELS`.\n * Only keys you provide are overridden; all others fall back to the defaults.\n *\n * @example\n * const labels = resolveLabels({\n *   trade: { buy: 'Acheter', sell: 'Vendre' },\n * });\n */\nexport function resolveLabels(override?: DeepPartial<ChartLabels>): ChartLabels {\n    if (!override) return DEFAULT_LABELS;\n\n    const base = DEFAULT_LABELS;\n\n    return {\n        topBar: {\n            ...base.topBar,\n            ...override.topBar,\n            series:     { ...base.topBar.series,     ...override.topBar?.series },\n            timeframes: { ...base.topBar.timeframes, ...override.topBar?.timeframes },\n        },\n        bottomBar: {\n            durations: { ...base.bottomBar.durations, ...override.bottomBar?.durations },\n        },\n        drawingToolbar: {\n            ...base.drawingToolbar,\n            ...override.drawingToolbar,\n            categories: { ...base.drawingToolbar.categories, ...override.drawingToolbar?.categories },\n            tools:      { ...base.drawingToolbar.tools,      ...override.drawingToolbar?.tools },\n            actions:    { ...base.drawingToolbar.actions,    ...override.drawingToolbar?.actions },\n        },\n        ohlc:  { ...base.ohlc,  ...override.ohlc },\n        trade: { ...base.trade, ...override.trade },\n        dialogs: {\n            settings:  { ...base.dialogs.settings,  ...override.dialogs?.settings },\n            indicator: { ...base.dialogs.indicator, ...override.dialogs?.indicator },\n        },\n        chart: { ...base.chart, ...override.chart },\n    };\n}\n","import type { Viewport } from '../core/types.js';\n\nexport interface MomentumOptions {\n  /** Enable momentum (kinetic) scrolling. Default: `true`. */\n  enabled?: boolean;\n  /**\n   * Per-frame velocity decay factor, normalised to 60 fps.\n   * `0.95` = 95% speed retained per 16.67 ms frame. Clamped to [0.80, 0.99].\n   * Default: `0.95`.\n   */\n  decay?: number;\n  /**\n   * Minimum release velocity (px/ms) required to launch momentum.\n   * Default: `0.3`.\n   */\n  threshold?: number;\n  /**\n   * Maximum launch velocity (px/ms). Caps hard-flick launches.\n   * Default: `6.0`.\n   */\n  maxVelocity?: number;\n}\n\nexport class PanHandler {\n  private isDragging = false;\n  private isTouchDrag = false;\n  private lastX = 0;\n  private lastY = 0;\n  private dragStartX = 0;\n  private dragStartY = 0;\n  private hasPanned = false;\n  private dragStartFired = false;\n  private static readonly DRAG_THRESHOLD = 4; // px — below this = click, not drag\n\n  // ── Momentum config ────────────────────────────────────────────────────────\n  private readonly _momentumEnabled: boolean;\n  private readonly _momentumDecay: number;\n  private readonly _momentumThreshold: number;\n  private readonly _momentumMaxVelocity: number;\n\n  // ── Velocity sample buffer (rolling 100 ms window) ─────────────────────────\n  private readonly _velBuffer: Array<{ dx: number; t: number }> = [];\n  private static readonly VEL_WINDOW_MS = 100;\n\n  // ── In-flight momentum RAF ─────────────────────────────────────────────────\n  private _momentumRafId: number | null = null;\n\n  constructor(\n    private readonly canvas: HTMLCanvasElement,\n    private getViewport: () => Viewport,\n    private setViewport: (v: Viewport) => void,\n    private totalBars: () => number,\n    private onUpdate: () => void,\n    /** When this returns true, all pan interaction is suppressed (e.g. drawing mode). */\n    private isLocked: () => boolean = () => false,\n    /** Optional vertical pan callback — receives pixel delta Y. */\n    private panY?: (deltaY: number) => void,\n    private onDragStart?: () => void,\n    private onDragEnd?: () => void,\n    momentumOptions?: MomentumOptions,\n  ) {\n    this._momentumEnabled  = momentumOptions?.enabled   ?? true;\n    this._momentumDecay    = Math.min(0.99, Math.max(0.80, momentumOptions?.decay    ?? 0.95));\n    this._momentumThreshold = momentumOptions?.threshold  ?? 0.3;\n    this._momentumMaxVelocity = momentumOptions?.maxVelocity ?? 6.0;\n    this.attach();\n  }\n\n  private attach(): void {\n    this.canvas.addEventListener('mousedown', this.onMouseDown);\n    window.addEventListener('mousemove', this.onMouseMove);\n    window.addEventListener('mouseup', this.onMouseUp);\n\n    // Touch support\n    this.canvas.addEventListener('touchstart', this.onTouchStart, { passive: false });\n    window.addEventListener('touchmove', this.onTouchMove, { passive: false });\n    window.addEventListener('touchend', this.onMouseUp);\n  }\n\n  /** Cancel any in-progress pan gesture or momentum (e.g. when a drawing drag takes over). */\n  cancel(): void {\n    this._stopMomentum();\n    this.isDragging = false;\n    this.hasPanned = false;\n  }\n\n  destroy(): void {\n    this._stopMomentum();\n    this.canvas.removeEventListener('mousedown', this.onMouseDown);\n    window.removeEventListener('mousemove', this.onMouseMove);\n    window.removeEventListener('mouseup', this.onMouseUp);\n    this.canvas.removeEventListener('touchstart', this.onTouchStart);\n    window.removeEventListener('touchmove', this.onTouchMove);\n    window.removeEventListener('touchend', this.onMouseUp);\n  }\n\n  private onMouseDown = (e: MouseEvent) => {\n    this._stopMomentum();\n    if (this.isLocked()) return;\n    this.isDragging = true;\n    this.isTouchDrag = false;\n    this.lastX = e.clientX;\n    this.lastY = e.clientY;\n    this.dragStartX = e.clientX;\n    this.dragStartY = e.clientY;\n    this.hasPanned = false;\n    this._velBuffer.length = 0;\n  };\n\n  private onTouchStart = (e: TouchEvent) => {\n    // Multi-touch (pinch zoom): kill any in-flight momentum and abort\n    if (e.touches.length !== 1) {\n      this._stopMomentum();\n      return;\n    }\n    this._stopMomentum();\n    if (this.isLocked()) return;\n    this.isDragging = true;\n    this.isTouchDrag = true;\n    this.lastX = e.touches[0].clientX;\n    this.lastY = e.touches[0].clientY;\n    this.dragStartX = e.touches[0].clientX;\n    this.dragStartY = e.touches[0].clientY;\n    this.dragStartFired = true;\n    this._velBuffer.length = 0;\n    this.onDragStart?.();\n  };\n\n  private onMouseMove = (e: MouseEvent) => {\n    if (!this.isDragging) return;\n    if (this.isLocked()) { this.isDragging = false; this.hasPanned = false; return; }\n    const deltaX = e.clientX - this.lastX;\n    const deltaY = e.clientY - this.lastY;\n    this.lastX = e.clientX;\n    this.lastY = e.clientY;\n    const totalDeltaX = Math.abs(e.clientX - this.dragStartX);\n    const totalDeltaY = Math.abs(e.clientY - this.dragStartY);\n    if (!this.hasPanned && (totalDeltaX > PanHandler.DRAG_THRESHOLD || totalDeltaY > PanHandler.DRAG_THRESHOLD)) {\n      this.hasPanned = true;\n      this.dragStartFired = true;\n      this.onDragStart?.();\n      this.canvas.style.cursor = 'grabbing';\n    }\n    if (this.hasPanned) {\n      this._recordVelocitySample(deltaX, performance.now());\n      this.pan(deltaX);\n      if (this.panY) this.panY(deltaY);\n    }\n  };\n\n  private onTouchMove = (e: TouchEvent) => {\n    if (!this.isDragging || e.touches.length !== 1) return;\n    if (this.isLocked()) { this.isDragging = false; return; }\n    e.preventDefault();\n    const deltaX = e.touches[0].clientX - this.lastX;\n    const deltaY = e.touches[0].clientY - this.lastY;\n    this._recordVelocitySample(deltaX, performance.now());\n    this.pan(deltaX);\n    if (this.panY) this.panY(deltaY);\n    this.lastX = e.touches[0].clientX;\n    this.lastY = e.touches[0].clientY;\n  };\n\n  private onMouseUp = () => {\n    if (this.hasPanned) this.canvas.style.cursor = 'crosshair';\n    this.isDragging = false;\n    this.hasPanned = false;\n\n    if (this.dragStartFired) {\n      this.dragStartFired = false;\n      const velocity = this._computeReleaseVelocity();\n      this._velBuffer.length = 0;\n      const launched = this._startMomentum(velocity);\n      // If no momentum launched, fire onDragEnd immediately.\n      // If momentum launched, onDragEnd fires when momentum stops.\n      if (!launched) this.onDragEnd?.();\n    }\n  };\n\n  // ── Velocity tracking ────────────────────────────────────────────────────────\n\n  private _recordVelocitySample(dx: number, t: number): void {\n    this._velBuffer.push({ dx, t });\n    // Trim samples older than the rolling window\n    const cutoff = t - PanHandler.VEL_WINDOW_MS;\n    let i = 0;\n    while (i < this._velBuffer.length && this._velBuffer[i].t < cutoff) i++;\n    if (i > 0) this._velBuffer.splice(0, i);\n  }\n\n  private _computeReleaseVelocity(): number {\n    const buf = this._velBuffer;\n    if (buf.length < 2) return 0;\n    const totalDx = buf.reduce((acc, s) => acc + s.dx, 0);\n    const dt = buf[buf.length - 1].t - buf[0].t;\n    if (dt <= 0) return 0;\n    const raw = totalDx / dt; // px/ms\n    return Math.sign(raw) * Math.min(Math.abs(raw), this._momentumMaxVelocity);\n  }\n\n  // ── Momentum animation ────────────────────────────────────────────────────────\n\n  /**\n   * Launch momentum scrolling with the given initial velocity (px/ms).\n   * Returns `true` if momentum was successfully launched, `false` otherwise.\n   */\n  private _startMomentum(velocity: number): boolean {\n    if (!this._momentumEnabled) return false;\n    if (Math.abs(velocity) < this._momentumThreshold) return false;\n\n    let lastTime: number | null = null;\n    let vel = velocity;\n    const decay = this._momentumDecay;\n\n    const tick = (now: number) => {\n      if (lastTime === null) { lastTime = now; this._momentumRafId = requestAnimationFrame(tick); return; }\n\n      const dt = now - lastTime;\n      lastTime = now;\n\n      // fps-independent decay: pow(decay, dt / 16.67)\n      vel *= Math.pow(decay, dt / 16.67);\n\n      const pixelDelta = vel * dt;\n\n      // Stop when displacement this frame is negligible (< 0.5 px)\n      if (Math.abs(pixelDelta) < 0.5) {\n        this._stopMomentum();\n        this.onDragEnd?.();\n        return;\n      }\n\n      // Stop if interaction is locked mid-momentum\n      if (this.isLocked()) {\n        this._stopMomentum();\n        this.onDragEnd?.();\n        return;\n      }\n\n      // Detect boundary: if pan() produces no movement, we hit an edge\n      const prevStart = this.getViewport().startIndex;\n      this.pan(pixelDelta);\n      if (this.getViewport().startIndex === prevStart) {\n        this._stopMomentum();\n        this.onDragEnd?.();\n        return;\n      }\n\n      this._momentumRafId = requestAnimationFrame(tick);\n    };\n\n    this._momentumRafId = requestAnimationFrame(tick);\n    return true;\n  }\n\n  private _stopMomentum(): void {\n    if (this._momentumRafId !== null) {\n      cancelAnimationFrame(this._momentumRafId);\n      this._momentumRafId = null;\n    }\n  }\n\n  // ── Core pan logic ────────────────────────────────────────────────────────────\n\n  private pan(deltaX: number): void {\n    const vp = this.getViewport();\n    const visibleBars = vp.endIndex - vp.startIndex;\n    const width = this.isTouchDrag\n      ? (this.canvas.clientWidth || this.canvas.width / (window.devicePixelRatio || 1))\n      : this.canvas.width;\n    const barsPerPixel = visibleBars / width;\n    const shift = -deltaX * barsPerPixel;\n\n    const maxStart = Math.max(0, this.totalBars() - Math.floor(visibleBars / 2)); // allow last bar to scroll to ~50% of canvas\n    const newStart = Math.max(0, Math.min(maxStart, vp.startIndex + shift));\n\n    this.setViewport({ ...vp, startIndex: newStart, endIndex: newStart + visibleBars });\n    this.onUpdate();\n  }\n}\n","import type { Viewport } from '../core/types.js';\n\nconst MIN_VISIBLE_BARS = 10;\nconst MAX_VISIBLE_BARS = 500;\n\nexport class ZoomHandler {\n  private _pinchStartDist = 0;\n  private _pinchStartRatio = 0;\n  private _pinchStartViewport: Viewport | null = null;\n\n  constructor(\n    private readonly canvas: HTMLCanvasElement,\n    private getViewport: () => Viewport,\n    private setViewport: (v: Viewport) => void,\n    private totalBars: () => number,\n    private onUpdate: () => void,\n    private getCanvasRect: () => DOMRect = () => canvas.getBoundingClientRect(),\n    private getChartWidth: () => number = () => canvas.offsetWidth,\n    private panByPixelDelta?: (dx: number) => void,\n  ) {\n    this.attach();\n  }\n\n  private attach(): void {\n    this.canvas.addEventListener('wheel', this.onWheel, { passive: false });\n    this.canvas.addEventListener('touchstart', this.onTouchStart, { passive: false });\n    this.canvas.addEventListener('touchmove',  this.onTouchMove,  { passive: false });\n    this.canvas.addEventListener('touchend',   this.onTouchEnd);\n  }\n\n  destroy(): void {\n    this.canvas.removeEventListener('wheel', this.onWheel);\n    this.canvas.removeEventListener('touchstart', this.onTouchStart);\n    this.canvas.removeEventListener('touchmove',  this.onTouchMove);\n    this.canvas.removeEventListener('touchend',   this.onTouchEnd);\n  }\n\n  private onWheel = (e: WheelEvent): void => {\n    e.preventDefault();\n\n    const vp = this.getViewport();\n    const visibleBars = vp.endIndex - vp.startIndex;\n\n    // On macOS trackpads (and Windows touchpads with pinch), browsers synthesize\n    // a wheel event with `ctrlKey === true` for pinch gestures. The `deltaY`\n    // values are small/continuous, so a fixed-step factor produces a jumpy zoom.\n    // Use a smooth proportional factor for pinch, fixed step for regular scroll.\n    let zoomFactor: number;\n    if (e.ctrlKey) {\n      // Pinch: smooth, proportional. Clamp deltaY to avoid extreme jumps.\n      const clamped = Math.max(-50, Math.min(50, e.deltaY));\n      zoomFactor = Math.exp(clamped * 0.01);\n    } else {\n      // Horizontal trackpad swipe: route to pan instead of zoom.\n      // deltaX dominates (or is non-zero alongside a small deltaY) → pan.\n      if (e.deltaX !== 0 && Math.abs(e.deltaX) > Math.abs(e.deltaY) * 0.5) {\n        if (this.panByPixelDelta) this.panByPixelDelta(e.deltaX);\n        this.onUpdate();\n        return;\n      }\n      if (e.deltaY === 0) return;\n      zoomFactor = e.deltaY > 0 ? 1.1 : 0.9; // scroll down = zoom out\n    }\n    const newVisible = Math.round(\n      Math.max(MIN_VISIBLE_BARS, Math.min(MAX_VISIBLE_BARS, visibleBars * zoomFactor)),\n    );\n\n    if (vp.endIndex >= this.totalBars()) {\n      // At the live edge: anchor the right side so the last candle stays\n      // near the price axis instead of drifting left on zoom-in.\n      // Clamp endIndex to at most floor(newVisible/2) bars past the data end,\n      // consistent with the pan handler's right-boundary formula. Without this\n      // clamp, panning to the rightmost position (endIndex = totalBars + visibleBars/2)\n      // then zooming in would anchor far past real data and blank the chart.\n      const newEnd = Math.min(vp.endIndex, this.totalBars() + Math.floor(newVisible / 2));\n      const newStart = Math.max(0, newEnd - newVisible);\n      this.setViewport({ ...vp, startIndex: newStart, endIndex: newStart + newVisible });\n    } else {\n      // Historical view: zoom around the mouse cursor position.\n      // Use getChartWidth() (CSS pixels) to match e.offsetX (also CSS pixels).\n      // canvas.width is in physical pixels and would give a wrong ratio on retina displays.\n      const mouseRatio = e.offsetX / this.getChartWidth();\n      const pivotBar = vp.startIndex + visibleBars * mouseRatio;\n      const newStart = Math.max(0, pivotBar - newVisible * mouseRatio);\n      this.setViewport({ ...vp, startIndex: newStart, endIndex: newStart + newVisible });\n    }\n\n    this.onUpdate();\n  };\n\n  private onTouchStart = (e: TouchEvent): void => {\n    if (e.touches.length !== 2) return;\n    const dist = this.pinchDist(e.touches[0], e.touches[1]);\n    this._pinchStartDist = dist;\n    this._pinchStartViewport = { ...this.getViewport() };\n\n    const rect = this.getCanvasRect();\n    const midClientX = (e.touches[0].clientX + e.touches[1].clientX) / 2;\n    const midX = midClientX - rect.left;\n    this._pinchStartRatio = Math.max(0, Math.min(1, midX / this.getChartWidth()));\n  };\n\n  private onTouchMove = (e: TouchEvent): void => {\n    if (e.touches.length !== 2) return;\n    e.preventDefault();\n\n    const currentDist = this.pinchDist(e.touches[0], e.touches[1]);\n\n    // Fallback: initialize if touchstart was missed\n    if (this._pinchStartDist === 0 || !this._pinchStartViewport) {\n      this._pinchStartDist = currentDist;\n      this._pinchStartViewport = { ...this.getViewport() };\n      const rect = this.getCanvasRect();\n      const midClientX = (e.touches[0].clientX + e.touches[1].clientX) / 2;\n      this._pinchStartRatio = Math.max(0, Math.min(1, (midClientX - rect.left) / this.getChartWidth()));\n      return;\n    }\n\n    // Total zoom factor from gesture start — avoids incremental drift accumulation\n    const totalFactor = this._pinchStartDist / currentDist;\n\n    const vp = this._pinchStartViewport;\n    const startVisibleBars = vp.endIndex - vp.startIndex;\n    const newVisible = Math.round(\n      Math.max(MIN_VISIBLE_BARS, Math.min(MAX_VISIBLE_BARS, startVisibleBars * totalFactor)),\n    );\n\n    // Anchor around the fixed initial midpoint — midpoint drift mid-gesture has no effect\n    const mouseRatio = this._pinchStartRatio;\n    const pivotBar = vp.startIndex + startVisibleBars * mouseRatio;\n    const newStart = Math.max(0, pivotBar - newVisible * mouseRatio);\n    this.setViewport({ ...vp, startIndex: newStart, endIndex: newStart + newVisible });\n    this.onUpdate();\n  };\n\n  private onTouchEnd = (): void => {\n    this._pinchStartDist = 0;\n    this._pinchStartViewport = null;\n  };\n\n  private pinchDist(t0: Touch, t1: Touch): number {\n    const dx = t1.clientX - t0.clientX;\n    const dy = t1.clientY - t0.clientY;\n    return Math.sqrt(dx * dx + dy * dy);\n  }\n}\n","import type { OHLCVBar, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\nexport function renderCandlestick(\n  ctx: CanvasRenderingContext2D,\n  bars: OHLCVBar[],\n  viewport: Viewport,\n  priceRange: PriceRange,\n  scale: ScaleManager,\n  theme: ChartTheme,\n  chartWidth: number,\n  chartHeight: number,\n): void {\n  const bodyWidth = scale.candleBodyWidth(viewport, chartWidth);\n  const n = bars.length;\n\n  // Precompute pixel coords once to avoid redundant transform calls across passes\n  const xs      = new Float32Array(n);\n  const highsY  = new Float32Array(n);\n  const lowsY   = new Float32Array(n);\n  const opensY  = new Float32Array(n);\n  const closesY = new Float32Array(n);\n  const upFlags = new Uint8Array(n);\n\n  const startBar = Math.floor(viewport.startIndex);\n  for (let i = 0; i < n; i++) {\n    const bar = bars[i];\n    xs[i]      = scale.xToPixel(startBar + i, viewport, chartWidth);\n    highsY[i]  = scale.yToPixel(bar.high,  priceRange, chartHeight);\n    lowsY[i]   = scale.yToPixel(bar.low,   priceRange, chartHeight);\n    opensY[i]  = scale.yToPixel(bar.open,  priceRange, chartHeight);\n    closesY[i] = scale.yToPixel(bar.close, priceRange, chartHeight);\n    upFlags[i] = bar.close >= bar.open ? 1 : 0;\n  }\n\n  ctx.lineWidth = 1;\n\n  // Pass 1a: up wicks — one batched path\n  ctx.strokeStyle = theme.candle.wickUp;\n  ctx.beginPath();\n  for (let i = 0; i < n; i++) {\n    if (upFlags[i]) { ctx.moveTo(xs[i], highsY[i]); ctx.lineTo(xs[i], lowsY[i]); }\n  }\n  ctx.stroke();\n\n  // Pass 1b: down wicks — one batched path\n  ctx.strokeStyle = theme.candle.wickDown;\n  ctx.beginPath();\n  for (let i = 0; i < n; i++) {\n    if (!upFlags[i]) { ctx.moveTo(xs[i], highsY[i]); ctx.lineTo(xs[i], lowsY[i]); }\n  }\n  ctx.stroke();\n\n  // Pass 2: bodies\n  for (let i = 0; i < n; i++) {\n    const bodyTop     = Math.min(opensY[i], closesY[i]);\n    const bodyHeight  = Math.max(Math.abs(closesY[i] - opensY[i]), 1);\n    const isUp        = upFlags[i] === 1;\n    const fillColor   = isUp ? theme.candle.up   : theme.candle.down;\n    const borderColor = isUp\n      ? (theme.candle.borderUp   ?? theme.candle.up)\n      : (theme.candle.borderDown ?? theme.candle.down);\n    ctx.fillStyle = fillColor;\n    ctx.fillRect(xs[i] - bodyWidth / 2, bodyTop, bodyWidth, bodyHeight);\n    if (borderColor !== fillColor) {\n      ctx.strokeStyle = borderColor;\n      ctx.lineWidth   = 1;\n      ctx.strokeRect(xs[i] - bodyWidth / 2, bodyTop, bodyWidth, bodyHeight);\n    }\n  }\n}\n","import type { OHLCVBar, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\n/**\n * Hollow candle series:\n *  - Up bar (close >= open): hollow body (stroke only), wick in up color\n *  - Down bar (close < open): filled body, wick in down color\n */\nexport function renderHollowCandle(\n    ctx: CanvasRenderingContext2D,\n    bars: OHLCVBar[],\n    viewport: Viewport,\n    priceRange: PriceRange,\n    scale: ScaleManager,\n    theme: ChartTheme,\n    chartWidth: number,\n    chartHeight: number,\n): void {\n    const bodyWidth = scale.candleBodyWidth(viewport, chartWidth);\n    const startBar = Math.floor(viewport.startIndex);\n\n    for (let i = 0; i < bars.length; i++) {\n        const bar = bars[i];\n        const barIndex = startBar + i;\n        const x = scale.xToPixel(barIndex, viewport, chartWidth);\n        const isUp = bar.close >= bar.open;\n\n        const openY  = scale.yToPixel(bar.open,  priceRange, chartHeight);\n        const closeY = scale.yToPixel(bar.close, priceRange, chartHeight);\n        const highY  = scale.yToPixel(bar.high,  priceRange, chartHeight);\n        const lowY   = scale.yToPixel(bar.low,   priceRange, chartHeight);\n\n        const color     = isUp ? theme.candle.up   : theme.candle.down;\n        const wickColor = isUp ? theme.candle.wickUp : theme.candle.wickDown;\n\n        // Wick\n        ctx.beginPath();\n        ctx.strokeStyle = wickColor;\n        ctx.lineWidth = 1;\n        ctx.moveTo(x, highY);\n        ctx.lineTo(x, lowY);\n        ctx.stroke();\n\n        // Body\n        const bodyTop    = Math.min(openY, closeY);\n        const bodyHeight = Math.max(Math.abs(closeY - openY), 1);\n\n        if (isUp) {\n            // Hollow: stroke only\n            ctx.strokeStyle = color;\n            ctx.lineWidth = 1;\n            ctx.strokeRect(x - bodyWidth / 2, bodyTop, bodyWidth, bodyHeight);\n        } else {\n            // Filled\n            const borderColor = theme.candle.borderDown ?? theme.candle.down;\n            ctx.fillStyle = color;\n            ctx.fillRect(x - bodyWidth / 2, bodyTop, bodyWidth, bodyHeight);\n            if (borderColor !== color) {\n                ctx.strokeStyle = borderColor;\n                ctx.lineWidth   = 1;\n                ctx.strokeRect(x - bodyWidth / 2, bodyTop, bodyWidth, bodyHeight);\n            }\n        }\n    }\n}\n","import type { OHLCVBar, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\nfunction withAlpha(color: string, alpha: number): string {\n  // Handle rgb() / rgba() format (returned by getComputedStyle after CSS var resolution)\n  const rgbMatch = color.match(/rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)/);\n  if (rgbMatch) {\n    return `rgba(${rgbMatch[1]},${rgbMatch[2]},${rgbMatch[3]},${alpha})`;\n  }\n  // Handle hex format #rrggbb or #rgb\n  const h = color.replace('#', '');\n  const f = h.length === 3 ? h.split('').map(c => c + c).join('') : h;\n  const r = parseInt(f.slice(0, 2), 16);\n  const g = parseInt(f.slice(2, 4), 16);\n  const b = parseInt(f.slice(4, 6), 16);\n  return `rgba(${r},${g},${b},${alpha})`;\n}\n\ninterface GradCache { gradient: CanvasGradient; height: number; color: string }\nlet _gradCache: GradCache | null = null;\n\nexport function renderLine(\n  ctx: CanvasRenderingContext2D,\n  bars: OHLCVBar[],\n  viewport: Viewport,\n  priceRange: PriceRange,\n  scale: ScaleManager,\n  theme: ChartTheme,\n  chartWidth: number,\n  chartHeight: number,\n  area = false,\n): void {\n  if (bars.length === 0) return;\n\n  const startBar = Math.floor(viewport.startIndex);\n\n  // ── Area fill (drawn first, underneath the line) ──────────────────────────\n  if (area) {\n    const lastX  = scale.xToPixel(startBar + bars.length - 1, viewport, chartWidth);\n    const firstX = scale.xToPixel(startBar, viewport, chartWidth);\n\n    ctx.beginPath();\n    for (let i = 0; i < bars.length; i++) {\n      const x = scale.xToPixel(startBar + i, viewport, chartWidth);\n      const y = scale.yToPixel(bars[i].close, priceRange, chartHeight);\n      i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y);\n    }\n    ctx.lineTo(lastX, chartHeight);\n    ctx.lineTo(firstX, chartHeight);\n    ctx.closePath();\n\n    if (!_gradCache || _gradCache.height !== chartHeight || _gradCache.color !== theme.candle.up) {\n      const grad = ctx.createLinearGradient(0, 0, 0, chartHeight);\n      grad.addColorStop(0, withAlpha(theme.candle.up, 0.15));\n      grad.addColorStop(1, withAlpha(theme.candle.up, 0));\n      _gradCache = { gradient: grad, height: chartHeight, color: theme.candle.up };\n    }\n    ctx.fillStyle = _gradCache.gradient;\n    ctx.fill();\n  }\n\n  // ── Line stroke (drawn on top of the fill) ────────────────────────────────\n  ctx.beginPath();\n  ctx.strokeStyle = theme.candle.up;\n  ctx.lineWidth = 1.5;\n  ctx.lineJoin = 'round';\n\n  for (let i = 0; i < bars.length; i++) {\n    const x = scale.xToPixel(startBar + i, viewport, chartWidth);\n    const y = scale.yToPixel(bars[i].close, priceRange, chartHeight);\n    i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y);\n  }\n\n  ctx.stroke();\n}\n","import type { OHLCVBar, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\nexport function renderOHLC(\n  ctx: CanvasRenderingContext2D,\n  bars: OHLCVBar[],\n  viewport: Viewport,\n  priceRange: PriceRange,\n  scale: ScaleManager,\n  theme: ChartTheme,\n  chartWidth: number,\n  chartHeight: number,\n): void {\n  const tickWidth = Math.max(2, scale.candleBodyWidth(viewport, chartWidth) * 0.4);\n  const startBar = Math.floor(viewport.startIndex);\n\n  for (let i = 0; i < bars.length; i++) {\n    const bar = bars[i];\n    const barIndex = startBar + i;\n    const x = scale.xToPixel(barIndex, viewport, chartWidth);\n    const isUp = bar.close >= bar.open;\n    const color = isUp ? theme.candle.up : theme.candle.down;\n\n    const openY = scale.yToPixel(bar.open, priceRange, chartHeight);\n    const closeY = scale.yToPixel(bar.close, priceRange, chartHeight);\n    const highY = scale.yToPixel(bar.high, priceRange, chartHeight);\n    const lowY = scale.yToPixel(bar.low, priceRange, chartHeight);\n\n    ctx.strokeStyle = color;\n    ctx.lineWidth = 1;\n\n    // High-low vertical line\n    ctx.beginPath();\n    ctx.moveTo(x, highY);\n    ctx.lineTo(x, lowY);\n    ctx.stroke();\n\n    // Open tick (left)\n    ctx.beginPath();\n    ctx.moveTo(x - tickWidth, openY);\n    ctx.lineTo(x, openY);\n    ctx.stroke();\n\n    // Close tick (right)\n    ctx.beginPath();\n    ctx.moveTo(x, closeY);\n    ctx.lineTo(x + tickWidth, closeY);\n    ctx.stroke();\n  }\n}\n","import type { OHLCVBar, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\nexport function renderVolume(\n  ctx: CanvasRenderingContext2D,\n  bars: OHLCVBar[],\n  viewport: Viewport,\n  maxVolume: number,\n  scale: ScaleManager,\n  theme: ChartTheme,\n  chartWidth: number,\n  panelHeight: number,\n  offsetY: number,\n): void {\n  const bodyWidth = scale.candleBodyWidth(viewport, chartWidth);\n  const startBar = Math.floor(viewport.startIndex);\n\n  for (let i = 0; i < bars.length; i++) {\n    const bar = bars[i];\n    if (bar.volume == null) continue;\n\n    const barIndex = startBar + i;\n    const x = scale.xToPixel(barIndex, viewport, chartWidth);\n    const isUp = bar.close >= bar.open;\n\n    const barHeight = panelHeight - scale.volumeToPixel(bar.volume, maxVolume, panelHeight);\n    const y = offsetY + panelHeight - barHeight;\n\n    ctx.fillStyle = isUp ? theme.volume.up : theme.volume.down;\n    ctx.fillRect(x - bodyWidth / 2, y, bodyWidth, barHeight);\n  }\n}\n","import type { OHLCVBar, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\nfunction computeHeikinAshi(bars: OHLCVBar[]): OHLCVBar[] {\n    const out: OHLCVBar[] = [];\n    for (let i = 0; i < bars.length; i++) {\n        const b = bars[i];\n        const haClose = (b.open + b.high + b.low + b.close) / 4;\n        const haOpen  = i === 0\n            ? (b.open + b.close) / 2\n            : (out[i - 1].open + out[i - 1].close) / 2;\n        out.push({\n            time:   b.time,\n            open:   haOpen,\n            close:  haClose,\n            high:   Math.max(b.high, haOpen, haClose),\n            low:    Math.min(b.low,  haOpen, haClose),\n            volume: b.volume,\n        });\n    }\n    return out;\n}\n\nexport function renderHeikinAshi(\n    ctx: CanvasRenderingContext2D,\n    bars: OHLCVBar[],\n    viewport: Viewport,\n    priceRange: PriceRange,\n    scale: ScaleManager,\n    theme: ChartTheme,\n    chartWidth: number,\n    chartHeight: number,\n): void {\n    const haBars    = computeHeikinAshi(bars);\n    const bodyWidth = scale.candleBodyWidth(viewport, chartWidth);\n    const startBar  = Math.floor(viewport.startIndex);\n\n    for (let i = 0; i < haBars.length; i++) {\n        const bar      = haBars[i];\n        const barIndex = startBar + i;\n        const x        = scale.xToPixel(barIndex, viewport, chartWidth);\n        const isUp     = bar.close >= bar.open;\n\n        const openY  = scale.yToPixel(bar.open,  priceRange, chartHeight);\n        const closeY = scale.yToPixel(bar.close, priceRange, chartHeight);\n        const highY  = scale.yToPixel(bar.high,  priceRange, chartHeight);\n        const lowY   = scale.yToPixel(bar.low,   priceRange, chartHeight);\n\n        const color       = isUp ? theme.candle.up   : theme.candle.down;\n        const wickColor   = isUp ? theme.candle.wickUp : theme.candle.wickDown;\n        const borderColor = isUp\n            ? (theme.candle.borderUp   ?? theme.candle.up)\n            : (theme.candle.borderDown ?? theme.candle.down);\n\n        // Wick\n        ctx.beginPath();\n        ctx.strokeStyle = wickColor;\n        ctx.lineWidth   = 1;\n        ctx.moveTo(x, highY);\n        ctx.lineTo(x, lowY);\n        ctx.stroke();\n\n        // Body\n        const bodyTop    = Math.min(openY, closeY);\n        const bodyHeight = Math.max(Math.abs(closeY - openY), 1);\n\n        ctx.fillStyle = color;\n        ctx.fillRect(x - bodyWidth / 2, bodyTop, bodyWidth, bodyHeight);\n        if (borderColor !== color) {\n            ctx.strokeStyle = borderColor;\n            ctx.lineWidth   = 1;\n            ctx.strokeRect(x - bodyWidth / 2, bodyTop, bodyWidth, bodyHeight);\n        }\n    }\n}\n","import type { OHLCVBar, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\nexport function renderVolumeCandles(\n    ctx: CanvasRenderingContext2D,\n    bars: OHLCVBar[],\n    viewport: Viewport,\n    priceRange: PriceRange,\n    scale: ScaleManager,\n    theme: ChartTheme,\n    chartWidth: number,\n    chartHeight: number,\n): void {\n    const baseBodyWidth = scale.candleBodyWidth(viewport, chartWidth);\n    const maxVol = Math.max(...bars.map(b => b.volume ?? 0), 1);\n    const startBar = Math.floor(viewport.startIndex);\n\n    for (let i = 0; i < bars.length; i++) {\n        const bar      = bars[i];\n        const barIndex = startBar + i;\n        const x        = scale.xToPixel(barIndex, viewport, chartWidth);\n        const isUp     = bar.close >= bar.open;\n\n        // Body width proportional to volume; fallback to base width when volume is absent\n        const volRatio  = maxVol > 0 ? (bar.volume ?? maxVol) / maxVol : 1;\n        const bodyWidth = Math.max(1, volRatio * baseBodyWidth);\n\n        const openY  = scale.yToPixel(bar.open,  priceRange, chartHeight);\n        const closeY = scale.yToPixel(bar.close, priceRange, chartHeight);\n        const highY  = scale.yToPixel(bar.high,  priceRange, chartHeight);\n        const lowY   = scale.yToPixel(bar.low,   priceRange, chartHeight);\n\n        const color       = isUp ? theme.candle.up   : theme.candle.down;\n        const wickColor   = isUp ? theme.candle.wickUp : theme.candle.wickDown;\n        const borderColor = isUp\n            ? (theme.candle.borderUp   ?? theme.candle.up)\n            : (theme.candle.borderDown ?? theme.candle.down);\n\n        // Wick\n        ctx.beginPath();\n        ctx.strokeStyle = wickColor;\n        ctx.lineWidth   = 1;\n        ctx.moveTo(x, highY);\n        ctx.lineTo(x, lowY);\n        ctx.stroke();\n\n        // Body\n        const bodyTop    = Math.min(openY, closeY);\n        const bodyHeight = Math.max(Math.abs(closeY - openY), 1);\n\n        ctx.fillStyle = color;\n        ctx.fillRect(x - bodyWidth / 2, bodyTop, bodyWidth, bodyHeight);\n        if (borderColor !== color) {\n            ctx.strokeStyle = borderColor;\n            ctx.lineWidth   = 1;\n            ctx.strokeRect(x - bodyWidth / 2, bodyTop, bodyWidth, bodyHeight);\n        }\n    }\n}\n","import type { OHLCVBar, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\nexport function renderLineWithMarkers(\n    ctx: CanvasRenderingContext2D,\n    bars: OHLCVBar[],\n    viewport: Viewport,\n    priceRange: PriceRange,\n    scale: ScaleManager,\n    theme: ChartTheme,\n    chartWidth: number,\n    chartHeight: number,\n): void {\n    if (bars.length === 0) return;\n\n    // Draw the line\n    ctx.beginPath();\n    ctx.strokeStyle = theme.candle.up;\n    ctx.lineWidth   = 1.5;\n    ctx.lineJoin    = 'round';\n\n    const startBar = Math.floor(viewport.startIndex);\n    for (let i = 0; i < bars.length; i++) {\n        const barIndex = startBar + i;\n        const x = scale.xToPixel(barIndex, viewport, chartWidth);\n        const y = scale.yToPixel(bars[i].close, priceRange, chartHeight);\n        i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y);\n    }\n    ctx.stroke();\n\n    // Draw circle markers at each close price point\n    const markerRadius = Math.min(3, scale.candleBodyWidth(viewport, chartWidth) * 0.35);\n    if (markerRadius < 0.5) return; // too zoomed out to draw markers\n\n    ctx.fillStyle = theme.candle.up;\n    for (let i = 0; i < bars.length; i++) {\n        const barIndex = startBar + i;\n        const x = scale.xToPixel(barIndex, viewport, chartWidth);\n        const y = scale.yToPixel(bars[i].close, priceRange, chartHeight);\n        ctx.beginPath();\n        ctx.arc(x, y, markerRadius, 0, Math.PI * 2);\n        ctx.fill();\n    }\n}\n","import type { OHLCVBar, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\nexport function renderStepLine(\n    ctx: CanvasRenderingContext2D,\n    bars: OHLCVBar[],\n    viewport: Viewport,\n    priceRange: PriceRange,\n    scale: ScaleManager,\n    theme: ChartTheme,\n    chartWidth: number,\n    chartHeight: number,\n): void {\n    if (bars.length === 0) return;\n\n    ctx.beginPath();\n    ctx.strokeStyle = theme.candle.up;\n    ctx.lineWidth   = 1.5;\n    ctx.lineJoin    = 'round';\n\n    const startBar = Math.floor(viewport.startIndex);\n    let prevY = 0;\n    for (let i = 0; i < bars.length; i++) {\n        const barIndex = startBar + i;\n        const x = scale.xToPixel(barIndex, viewport, chartWidth);\n        const y = scale.yToPixel(bars[i].close, priceRange, chartHeight);\n\n        if (i === 0) {\n            ctx.moveTo(x, y);\n        } else {\n            ctx.lineTo(x, prevY); // horizontal step at previous y\n            ctx.lineTo(x, y);     // vertical step to current y\n        }\n        prevY = y;\n    }\n    ctx.stroke();\n}\n","import type { OHLCVBar, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\nfunction withAlpha(hex: string, alpha: number): string {\n    const h = hex.replace('#', '');\n    const f = h.length === 3 ? h.split('').map(c => c + c).join('') : h;\n    const r = parseInt(f.slice(0, 2), 16);\n    const g = parseInt(f.slice(2, 4), 16);\n    const b = parseInt(f.slice(4, 6), 16);\n    return `rgba(${r},${g},${b},${alpha})`;\n}\n\nexport function renderHLCArea(\n    ctx: CanvasRenderingContext2D,\n    bars: OHLCVBar[],\n    viewport: Viewport,\n    priceRange: PriceRange,\n    scale: ScaleManager,\n    theme: ChartTheme,\n    chartWidth: number,\n    chartHeight: number,\n): void {\n    if (bars.length === 0) return;\n\n    // Build the high-low band as a closed polygon\n    const startBar = Math.floor(viewport.startIndex);\n    ctx.beginPath();\n    // Forward pass: high prices\n    for (let i = 0; i < bars.length; i++) {\n        const x = scale.xToPixel(startBar + i, viewport, chartWidth);\n        const y = scale.yToPixel(bars[i].high, priceRange, chartHeight);\n        i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y);\n    }\n    // Backward pass: low prices\n    for (let i = bars.length - 1; i >= 0; i--) {\n        const x = scale.xToPixel(startBar + i, viewport, chartWidth);\n        const y = scale.yToPixel(bars[i].low, priceRange, chartHeight);\n        ctx.lineTo(x, y);\n    }\n    ctx.closePath();\n    ctx.fillStyle = withAlpha(theme.candle.up, 0.12);\n    ctx.fill();\n\n    // Draw the close price line on top\n    ctx.beginPath();\n    ctx.strokeStyle = theme.candle.up;\n    ctx.lineWidth   = 1.5;\n    ctx.lineJoin    = 'round';\n    for (let i = 0; i < bars.length; i++) {\n        const x = scale.xToPixel(startBar + i, viewport, chartWidth);\n        const y = scale.yToPixel(bars[i].close, priceRange, chartHeight);\n        i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y);\n    }\n    ctx.stroke();\n}\n","import type { OHLCVBar, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\nfunction withAlpha(hex: string, alpha: number): string {\n    const h = hex.replace('#', '');\n    const f = h.length === 3 ? h.split('').map(c => c + c).join('') : h;\n    const r = parseInt(f.slice(0, 2), 16);\n    const g = parseInt(f.slice(2, 4), 16);\n    const b = parseInt(f.slice(4, 6), 16);\n    return `rgba(${r},${g},${b},${alpha})`;\n}\n\nexport function renderBaseline(\n    ctx: CanvasRenderingContext2D,\n    bars: OHLCVBar[],\n    viewport: Viewport,\n    priceRange: PriceRange,\n    scale: ScaleManager,\n    theme: ChartTheme,\n    chartWidth: number,\n    chartHeight: number,\n): void {\n    if (bars.length === 0) return;\n\n    const baselinePrice = (priceRange.min + priceRange.max) / 2;\n    const baselineY     = scale.yToPixel(baselinePrice, priceRange, chartHeight);\n\n    // Collect x/y points for the close line\n    const startBar = Math.floor(viewport.startIndex);\n    const pts: { x: number; y: number }[] = bars.map((bar, i) => ({\n        x: scale.xToPixel(startBar + i, viewport, chartWidth),\n        y: scale.yToPixel(bar.close, priceRange, chartHeight),\n    }));\n\n    const firstX = pts[0].x;\n    const lastX  = pts[pts.length - 1].x;\n\n    // Helper: build the area path (line path + bottom edge)\n    const buildAreaPath = (): void => {\n        ctx.beginPath();\n        for (let i = 0; i < pts.length; i++) {\n            i === 0 ? ctx.moveTo(pts[i].x, pts[i].y) : ctx.lineTo(pts[i].x, pts[i].y);\n        }\n        ctx.lineTo(lastX, baselineY);\n        ctx.lineTo(firstX, baselineY);\n        ctx.closePath();\n    };\n\n    // Upper fill — close above baseline (green)\n    ctx.save();\n    ctx.beginPath();\n    ctx.rect(0, 0, chartWidth, baselineY);\n    ctx.clip();\n    buildAreaPath();\n    ctx.fillStyle = withAlpha(theme.candle.up, 0.15);\n    ctx.fill();\n    ctx.restore();\n\n    // Lower fill — close below baseline (red)\n    ctx.save();\n    ctx.beginPath();\n    ctx.rect(0, baselineY, chartWidth, chartHeight - baselineY);\n    ctx.clip();\n    buildAreaPath();\n    ctx.fillStyle = withAlpha(theme.candle.down, 0.15);\n    ctx.fill();\n    ctx.restore();\n\n    // Draw the close price line on top\n    ctx.beginPath();\n    ctx.strokeStyle = theme.candle.up;\n    ctx.lineWidth   = 1.5;\n    ctx.lineJoin    = 'round';\n    for (let i = 0; i < pts.length; i++) {\n        i === 0 ? ctx.moveTo(pts[i].x, pts[i].y) : ctx.lineTo(pts[i].x, pts[i].y);\n    }\n    ctx.stroke();\n\n    // Draw the baseline itself as a dashed horizontal line\n    ctx.beginPath();\n    ctx.strokeStyle   = withAlpha(theme.candle.up, 0.4);\n    ctx.lineWidth     = 1;\n    ctx.setLineDash([4, 4]);\n    ctx.moveTo(firstX, baselineY);\n    ctx.lineTo(lastX,  baselineY);\n    ctx.stroke();\n    ctx.setLineDash([]);\n}\n","import type { OHLCVBar, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\nexport function renderColumns(\n    ctx: CanvasRenderingContext2D,\n    bars: OHLCVBar[],\n    viewport: Viewport,\n    priceRange: PriceRange,\n    scale: ScaleManager,\n    theme: ChartTheme,\n    chartWidth: number,\n    chartHeight: number,\n): void {\n    const bodyWidth = scale.candleBodyWidth(viewport, chartWidth);\n    const startBar = Math.floor(viewport.startIndex);\n\n    for (let i = 0; i < bars.length; i++) {\n        const bar      = bars[i];\n        const barIndex = startBar + i;\n        const x        = scale.xToPixel(barIndex, viewport, chartWidth);\n        const isUp     = bar.close >= bar.open;\n\n        const closeY    = scale.yToPixel(bar.close, priceRange, chartHeight);\n        const barHeight = Math.max(1, chartHeight - closeY);\n\n        ctx.fillStyle = isUp ? theme.candle.up : theme.candle.down;\n        ctx.fillRect(x - bodyWidth / 2, closeY, bodyWidth, barHeight);\n    }\n}\n","import type { OHLCVBar, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\nexport function renderHighLow(\n    ctx: CanvasRenderingContext2D,\n    bars: OHLCVBar[],\n    viewport: Viewport,\n    priceRange: PriceRange,\n    scale: ScaleManager,\n    theme: ChartTheme,\n    chartWidth: number,\n    chartHeight: number,\n): void {\n    ctx.lineWidth = 1.5;\n    const startBar = Math.floor(viewport.startIndex);\n\n    for (let i = 0; i < bars.length; i++) {\n        const bar      = bars[i];\n        const barIndex = startBar + i;\n        const x        = scale.xToPixel(barIndex, viewport, chartWidth);\n        const isUp     = bar.close >= bar.open;\n\n        const highY = scale.yToPixel(bar.high, priceRange, chartHeight);\n        const lowY  = scale.yToPixel(bar.low,  priceRange, chartHeight);\n\n        ctx.strokeStyle = isUp ? theme.candle.up : theme.candle.down;\n        ctx.beginPath();\n        ctx.moveTo(x, highY);\n        ctx.lineTo(x, lowY);\n        ctx.stroke();\n    }\n}\n","import type { PriceRange } from '../core/types.js';\nimport { type ScaleManager, generatePriceTicks } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\nexport function renderGrid(\n    ctx: CanvasRenderingContext2D,\n    priceRange: PriceRange,\n    scale: ScaleManager,\n    theme: ChartTheme,\n    chartWidth: number,\n    chartHeight: number,\n    gridLines?: number\n): void {\n    ctx.save();\n    ctx.globalAlpha = 0.6;\n    ctx.strokeStyle = theme.grid;\n    ctx.lineWidth = 1;\n\n    // Horizontal lines — one batched path. Adaptive path matches PriceAxis\n    // pixel-for-pixel so labels and gridlines line up.\n    ctx.beginPath();\n    if (gridLines === undefined) {\n        for (const price of generatePriceTicks(priceRange, chartHeight)) {\n            const y = Math.round(scale.yToPixel(price, priceRange, chartHeight)) + 0.5;\n            ctx.moveTo(0, y);\n            ctx.lineTo(chartWidth, y);\n        }\n    } else {\n        const step = (priceRange.max - priceRange.min) / gridLines;\n        for (let i = 0; i <= gridLines; i++) {\n            const price = priceRange.min + step * i;\n            const y = Math.round(scale.yToPixel(price, priceRange, chartHeight)) + 0.5;\n            ctx.moveTo(0, y);\n            ctx.lineTo(chartWidth, y);\n        }\n    }\n    ctx.stroke();\n\n    // Vertical lines (every ~80px) — one batched path\n    const vertCols = Math.max(1, Math.floor(chartWidth / 80));\n    const xStep = chartWidth / vertCols;\n    ctx.beginPath();\n    for (let i = 1; i < vertCols; i++) {\n        const x = Math.round(i * xStep) + 0.5;\n        ctx.moveTo(x, 0);\n        ctx.lineTo(x, chartHeight);\n    }\n    ctx.stroke();\n\n    ctx.restore();\n}\n","import type { PriceRange, Viewport, CrosshairPosition, Timeframe } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { DEFAULT_CROSSHAIR_CONFIG, type CrosshairUiConfig } from '../core/uiConfig.js';\n\nconst SUB_DAILY: Timeframe[] = ['1m', '5m', '15m', '30m', '1h', '4h'];\n\nfunction formatCrosshairTime(ts: number, timeframe: Timeframe, timezone = 'UTC'): string {\n    const d = new Date(ts);\n    if (SUB_DAILY.includes(timeframe)) {\n        const date = d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric', timeZone: timezone });\n        const time = d.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit', hour12: false, timeZone: timezone });\n        return `${date}  ${time}`;\n    }\n    if (timeframe === '1M') {\n        return d.toLocaleDateString('en-US', { month: 'short', year: 'numeric', timeZone: timezone });\n    }\n    return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric', timeZone: timezone });\n}\n\nexport function renderCrosshair(\n  ctx: CanvasRenderingContext2D,\n  pos: CrosshairPosition,\n  priceRange: PriceRange,\n  viewport: Viewport,\n  scale: ScaleManager,\n  theme: ChartTheme,\n  chartWidth: number,\n  chartHeight: number,\n  priceAxisWidth: number,\n  axisY: number,\n  timeframe: Timeframe,\n  pricePrecision = 2,\n  cfg: CrosshairUiConfig = DEFAULT_CROSSHAIR_CONFIG,\n  timezone = 'UTC',\n): void {\n  const x = scale.xToPixel(pos.barIndex, viewport, chartWidth);\n  const y = scale.yToPixel(pos.price, priceRange, chartHeight);\n\n  ctx.setLineDash([4, 4]);\n  ctx.strokeStyle = theme.crosshair;\n  ctx.lineWidth = 1;\n\n  // Vertical line — extends through sub-panes to the time axis\n  ctx.beginPath();\n  ctx.moveTo(x, 0);\n  ctx.lineTo(x, axisY);\n  ctx.stroke();\n\n  // Horizontal line\n  ctx.beginPath();\n  ctx.moveTo(0, y);\n  ctx.lineTo(chartWidth, y);\n  ctx.stroke();\n\n  ctx.setLineDash([]);\n\n  const labelH   = cfg.labelHeight;\n  const labelPad = cfg.labelPaddingX;\n  ctx.font = `${cfg.fontSize} ${cfg.fontFamily}`;\n\n  // ── Price label on y-axis ─────────────────────────────────────────────────\n  const priceLabel = pos.price.toFixed(pricePrecision);\n  ctx.fillStyle = theme.tooltip.background;\n  ctx.fillRect(chartWidth, y - labelH / 2, priceAxisWidth, labelH);\n  ctx.strokeStyle = theme.crosshair;\n  ctx.lineWidth = 1;\n  ctx.strokeRect(chartWidth, y - labelH / 2, priceAxisWidth, labelH);\n  ctx.fillStyle = theme.tooltip.text;\n  ctx.textAlign = 'left';\n  ctx.fillText(priceLabel, chartWidth + labelPad, y + 4);\n\n  // ── Time label on x-axis ──────────────────────────────────────────────────\n  if (pos.bar) {\n      const timeLabel = formatCrosshairTime(pos.bar.time, timeframe, timezone);\n      const tw = ctx.measureText(timeLabel).width;\n      const boxW = tw + labelPad * 2;\n      const boxX = Math.max(0, Math.min(chartWidth - boxW, x - boxW / 2));\n\n      ctx.fillStyle = theme.tooltip.background;\n      ctx.fillRect(boxX, axisY, boxW, labelH);\n      ctx.strokeStyle = theme.crosshair;\n      ctx.lineWidth = 1;\n      ctx.strokeRect(boxX, axisY, boxW, labelH);\n      ctx.fillStyle = theme.tooltip.text;\n      ctx.textAlign = 'left';\n      ctx.fillText(timeLabel, boxX + labelPad, axisY + 13);\n  }\n}\n","import type { AnyLevel, PositionLevel } from '../core/types.js';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\n/** A measured level ready for cluster detection. */\nexport interface MeasuredLevel {\n    level: AnyLevel;\n    price: number;\n    y: number;\n    boxW: number;\n    boxH: number;\n}\n\n/** A cluster of levels whose Y pixel positions are within the proximity threshold. */\nexport interface LevelCluster {\n    /** Stable ID: `\"cluster:\" + sorted labels joined by \"|\"`. */\n    id: string;\n    /** Member levels in this cluster. */\n    members: MeasuredLevel[];\n    /** Average Y pixel position — where the cluster badge is centered. */\n    centerY: number;\n    /** Average price of the members. */\n    centerPrice: number;\n}\n\n/** Hit area for a rendered cluster badge pill. */\nexport interface ClusterBadgeHitArea {\n    clusterId: string;\n    x: number;\n    y: number;\n    w: number;\n    h: number;\n}\n\n// ── Cluster Detection ─────────────────────────────────────────────────────────\n\n/**\n * Detect clusters of levels whose Y pixel positions are within `thresholdPx`.\n *\n * Uses a greedy sweep: sort by Y, accumulate into current cluster while\n * `nextY - firstMemberY < thresholdPx`. Single-member clusters are discarded.\n *\n * Levels with `boxW === 0` (dot-mode or market drafts) participate using a\n * minimum effective height of 12px for proximity detection.\n *\n * @param excludeLabels - Labels to exclude from clustering (e.g. draft orders).\n */\nexport function detectClusters(\n    measured: MeasuredLevel[],\n    thresholdPx: number,\n    excludeLabels: ReadonlySet<string> = new Set()\n): LevelCluster[] {\n    // Filter out excluded labels and sort by Y\n    const eligible = measured\n        .filter((m) => !excludeLabels.has(m.level.label))\n        .sort((a, b) => a.y - b.y);\n\n    if (eligible.length < 2) return [];\n\n    const groups: MeasuredLevel[][] = [];\n    let currentGroup: MeasuredLevel[] = [eligible[0]];\n    let groupStartY = eligible[0].y;\n\n    for (let i = 1; i < eligible.length; i++) {\n        const m = eligible[i];\n        if (m.y - groupStartY <= thresholdPx) {\n            currentGroup.push(m);\n        } else {\n            groups.push(currentGroup);\n            currentGroup = [m];\n            groupStartY = m.y;\n        }\n    }\n    groups.push(currentGroup);\n\n    // Only keep groups with 2+ members\n    return groups\n        .filter((g) => g.length >= 2)\n        .map((members) => {\n            const id =\n                'cluster:' +\n                members\n                    .map((m) => m.level.label)\n                    .sort()\n                    .join('|');\n            const centerY = members.reduce((sum, m) => sum + m.y, 0) / members.length;\n            const centerPrice = members.reduce((sum, m) => sum + m.price, 0) / members.length;\n            return { id, members, centerY, centerPrice };\n        });\n}\n\n// ── Fan-out Layout ────────────────────────────────────────────────────────────\n\n/**\n * Compute fanned-out boxY positions for each member of an expanded cluster.\n * Members are spaced evenly, centered around `cluster.centerY`.\n *\n * @returns Map from level label to its fanned-out boxY (top of info box).\n */\nexport function computeFanOutLayout(\n    cluster: LevelCluster,\n    boxH: number,\n    gapPx: number = 4\n): Map<string, number> {\n    const n = cluster.members.length;\n    const totalH = n * boxH + (n - 1) * gapPx;\n    const startY = cluster.centerY - totalH / 2;\n\n    // Sort members by their original Y (top to bottom)\n    const sorted = [...cluster.members].sort((a, b) => a.y - b.y);\n\n    const result = new Map<string, number>();\n    for (let i = 0; i < sorted.length; i++) {\n        result.set(sorted[i].level.label, startY + i * (boxH + gapPx));\n    }\n    return result;\n}\n\n// ── Badge Layout ──────────────────────────────────────────────────────────────\n\nexport interface ClusterBadgeLayout {\n    badgeX: number;\n    badgeY: number;\n    badgeW: number;\n    badgeH: number;\n    text: string;\n}\n\n/**\n * Measure and position the cluster badge pill.\n * The badge is centered horizontally on the chart at `cluster.centerY`.\n */\nexport function buildClusterBadgeLayout(\n    cluster: LevelCluster,\n    chartW: number,\n    ctx: CanvasRenderingContext2D\n): ClusterBadgeLayout {\n    // Determine badge text — show per-type breakdown for mixed clusters.\n    // Entry orders (type='position' with entryPriceEditable) count as orders, not positions.\n    const posCount = cluster.members.filter(\n        (m) => m.level.type === 'position' && !(m.level as PositionLevel).entryPriceEditable\n    ).length;\n    const orderCount = cluster.members.filter(\n        (m) => m.level.type === 'pending' || (m.level as PositionLevel).entryPriceEditable === true\n    ).length;\n    const tradeCount = cluster.members.filter((m) => m.level.type === 'trade').length;\n    const parts: string[] = [];\n    if (posCount > 0) parts.push(`${posCount} Position${posCount > 1 ? 's' : ''}`);\n    if (orderCount > 0) parts.push(`${orderCount} Order${orderCount > 1 ? 's' : ''}`);\n    if (tradeCount > 0) parts.push(`${tradeCount} Trade${tradeCount > 1 ? 's' : ''}`);\n    const text = parts.join(' / ');\n\n    const PAD_X = 12;\n    const PAD_Y = 6;\n    const textW = ctx.measureText(text).width;\n    const EXPAND_ICON_W = 16; // space for ▸ expand icon\n    const badgeW = PAD_X + textW + EXPAND_ICON_W + PAD_X;\n    const badgeH = 24;\n    const badgeX = (chartW - badgeW) / 2;\n    const badgeY = cluster.centerY - badgeH / 2;\n\n    return { badgeX, badgeY, badgeW, badgeH, text };\n}\n\n// ── Hit Test ──────────────────────────────────────────────────────────────────\n\n/**\n * Returns the cluster badge hit area that contains the given coordinate,\n * or `null` if none match.\n */\nexport function hitTestClusterBadge(\n    x: number,\n    y: number,\n    areas: ClusterBadgeHitArea[]\n): ClusterBadgeHitArea | null {\n    return areas.find((a) => x >= a.x && x <= a.x + a.w && y >= a.y && y <= a.y + a.h) ?? null;\n}\n","import type {\n    AnyLevel,\n    PendingOrderLevel,\n    PositionLevel,\n    PositionRenderStyle,\n} from '../core/types.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { PriceRange } from '../core/types.js';\nimport {\n    detectClusters,\n    computeFanOutLayout,\n    buildClusterBadgeLayout,\n    type LevelCluster,\n    type ClusterBadgeHitArea,\n} from './TradeLevelCluster.js';\n\nexport { hitTestClusterBadge, type ClusterBadgeHitArea, type LevelCluster } from './TradeLevelCluster.js';\n\n// ── Layout constants ───────────────────────────────────────────────────────────\nconst BOX_PAD_X = 8; // horizontal padding inside main-level box\nconst PILL_PAD_X = 6; // horizontal padding inside QTY pill\nconst PILL_GAP = 6;   // gap between QTY pill right edge and label text\nconst BOX_PAD_Y = 4; // vertical padding inside main-level box\nconst ROW_H = 16; // height of one text row\nconst BOX_RADIUS = 3; // corner radius of info boxes\nconst LINE_WIDTH = 1; // main position/order line width\nconst CLOSE_R = 7; // radius of the × circle\nconst EDIT_R = 7; // radius of the edit/pencil circle\nconst EDIT_GAP = 4; // gap between edit circle and × circle\nconst CONFIRM_R = 7; // radius of the ✓ and ✗ circles\nconst CONFIRM_GAP = 4; // gap between confirm/cancel circles and × circle\nconst PNL_GAP = 6; // gap between pnl text and label text\nconst FONT_MAIN = \"13px 'Inter', system-ui, sans-serif\";\nconst FONT_PNL = \"13px 'Inter', system-ui, sans-serif\";\nconst GRIP_W = 14; // width of drag handle zone left of info box\nconst GRIP_DOT_R = 1.5; // radius of each grip dot\nconst BRACKET_LINE_W = 1; // SL/TP line width\nconst BRACKET_BOX_PAD_X = 5; // horizontal padding inside bracket info box\nconst BRACKET_BOX_PAD_Y = 3; // vertical padding inside bracket info box\nconst BRACKET_BOX_H = ROW_H + BRACKET_BOX_PAD_Y * 2; // ~20 px\nconst FONT_BRACKET = \"12px 'Inter', system-ui, sans-serif\";\nconst BRACKET_BASE_RATIO = 0.68; // bracket line X base: 72% of chartW (right zone, clear of centred main label)\n// Column offsets (fractions of chartW) tried in order for bracket line placement\nconst BRACKET_COL_OFFSETS = [0, -0.08, 0.08] as const;\nconst ADD_BRACKET_BTN_OFFSET_PX = 30; // px above/below entry line where +SL/+TP button appears\n\n/** × button hit area — returned so ChartEngine can detect close clicks. */\nexport interface TradeLevelHitArea {\n    label: string;\n    type: AnyLevel['type'];\n    data: unknown;\n    /** Present only for bracket (SL/TP) close buttons. */\n    bracketType?: 'stopLoss' | 'takeProfit';\n    /** Label of the ToClose order backing this bracket, when applicable. */\n    bracketOrderLabel?: string;\n    x: number;\n    y: number;\n    w: number;\n    h: number;\n}\n\n/** ✓ / ✗ confirm/cancel button hit area — returned for pending-change inline buttons. */\nexport interface TradeLevelConfirmArea {\n    label: string;\n    type: AnyLevel['type'];\n    data: unknown;\n    action: 'confirm' | 'cancel';\n    x: number;\n    y: number;\n    w: number;\n    h: number;\n}\n\n/** Box + line strip hit areas — used for hover detection. */\nexport interface TradeHoverArea {\n    label: string;\n    /** Bounding rect of the info box */\n    boxX: number;\n    boxY: number;\n    boxW: number;\n    boxH: number;\n    /** Thin strip along the line itself */\n    lineX: number;\n    lineY: number;\n    lineW: number;\n    lineH: number;\n}\n\n/** Drag handle hit area for the main level line (non-bracket). */\nexport interface TradeLevelDragArea {\n    label: string;\n    type: AnyLevel['type'];\n    data: unknown;\n    /** The price of this level — used to initialize drag state. */\n    price: number;\n    x: number;\n    y: number;\n    w: number;\n    h: number;\n    isBracket: false;\n    /**\n     * True when this area covers the info box (not the line strip or grip).\n     * On mobile a box tap opens the edit panel; only the line strip initiates a drag.\n     */\n    isBox?: boolean;\n}\n\n/** Drag handle hit area for a bracket (SL/TP) line. */\nexport interface TradeLevelBracketDragArea {\n    /** Label of the parent PendingOrderLevel. */\n    label: string;\n    data: unknown;\n    bracketType: 'stopLoss' | 'takeProfit';\n    /** The current price of this bracket line. */\n    price: number;\n    /** Price of the parent order (used for constraint enforcement). */\n    parentPrice: number;\n    /** Side of the parent order. */\n    parentSide: 'buy' | 'sell';\n    /**\n     * When this bracket originated from a `ToClose` pending order, this holds\n     * that order's own label — used in the drag confirmation message.\n     * Undefined for inline stopLossPrice / takeProfitPrice fields.\n     */\n    bracketOrderLabel?: string;\n    x: number;\n    y: number;\n    w: number;\n    h: number;\n    isBracket: true;\n}\n\nexport type AnyDragArea = TradeLevelDragArea | TradeLevelBracketDragArea;\n\n/** Hit area for the +SL / +TP add-bracket button shown when a level is selected and missing that bracket. */\nexport interface TradeAddBracketArea {\n    label: string;\n    type: AnyLevel['type'];\n    data: unknown;\n    bracketType: 'stopLoss' | 'takeProfit';\n    x: number;\n    y: number;\n    w: number;\n    h: number;\n}\n\n/** Hit area for the editable QTY pill on a draft order — returned when showQuantityField is true. */\nexport interface DraftQtyPillArea {\n    label: string;\n    pillX: number;\n    pillY: number;\n    pillW: number;\n    pillH: number;\n}\n\nexport interface TradeLevelRenderResult {\n    hitAreas: TradeLevelHitArea[];\n    editAreas: TradeLevelHitArea[];\n    hoverAreas: TradeHoverArea[];\n    dragAreas: AnyDragArea[];\n    confirmAreas: TradeLevelConfirmArea[];\n    addBracketAreas: TradeAddBracketArea[];\n    /** Hit areas for cluster badges — checked before individual level hit areas. */\n    clusterBadgeAreas: ClusterBadgeHitArea[];\n    /** Detected clusters from the last render (used for reverse lookups). */\n    clusters: LevelCluster[];\n    /** QTY pill hit area for the active draft order (only present when showQuantityField is true). */\n    draftQtyPillArea?: DraftQtyPillArea;\n}\n\n// ── Internal layout record ─────────────────────────────────────────────────────\ninterface LevelLayout {\n    price: number; // drag-aware price used to compute y\n    y: number; // line y pixel\n    boxY: number; // top of info box\n    boxW: number; // measured box width\n    boxH: number; // box height (single row)\n}\n\nfunction hasPnl(level: AnyLevel): level is AnyLevel & { pnlText: string } {\n    return level.type === 'position' && !!(level as { pnlText?: string }).pnlText;\n}\n\nfunction rectsOverlapY(ay: number, ah: number, by: number, bh: number): boolean {\n    return ay < by + bh && ay + ah > by;\n}\n\n/**\n * Push a bracket box away from the entry (and same-column obstacles) until no\n * overlap remains. Direction is +1 (push down) or -1 (push up); callers set\n * this based on screen-Y position so the rule works for both buy and sell\n * orders without referencing SL/TP semantics.\n *\n * Pure function — exported for unit testing.\n */\nexport function cascadeBracketAwayFromEntry(\n    entry: { boxY: number; boxH: number } | null,\n    preferredBoxY: number,\n    boxH: number,\n    direction: 1 | -1,\n    sameColumnObstacles: ReadonlyArray<{ boxY: number; boxH: number }>,\n): number {\n    const obstacles: Array<{ boxY: number; boxH: number }> = [];\n    if (entry) obstacles.push(entry);\n    for (const o of sameColumnObstacles) obstacles.push(o);\n\n    let boxY = preferredBoxY;\n    let attempts = 0;\n    const maxAttempts = obstacles.length + 2;\n    while (attempts < maxAttempts) {\n        const hit = obstacles.some((o) => rectsOverlapY(boxY, boxH, o.boxY, o.boxH));\n        if (!hit) break;\n        boxY += direction * (boxH + 2);\n        attempts++;\n    }\n    return boxY;\n}\n\n/**\n * Returns the display text for a level's info box.\n * ES/EL positions and pending orders show \"BUY/SELL {lots}L @{price}\".\n * All other levels fall back to level.text ?? level.label.\n */\nfunction getLevelDisplayText(level: AnyLevel, price: number, precision: number, omitLots: boolean = false): string {\n    if ((level.data as { _isDraft?: boolean } | undefined)?._isDraft) {\n        const p = level as PendingOrderLevel;\n        const sideLabel = p.side.charAt(0).toUpperCase() + p.side.slice(1);\n        const typeLabel = p.orderType.charAt(0).toUpperCase() + p.orderType.slice(1);\n        return `${sideLabel} ${typeLabel}`;\n    }\n\n    if (level.type === 'pending') {\n        const p = level as PendingOrderLevel;\n        const lotsStr = !omitLots && p.lots !== undefined ? ` ${p.lots}` : '';\n        return level.text ?? `${p.side.toUpperCase()}${lotsStr} @${price.toFixed(precision)}`;\n    }\n\n    if (level.type === 'position' && (level as PositionLevel).entryPriceEditable) {\n        const pos = level as PositionLevel;\n        const sideStr = pos.side ? pos.side.toUpperCase() : '';\n        const lotsStr = !omitLots && pos.lots !== undefined ? ` ${pos.lots}` : '';\n        return level.text ?? `${sideStr}${lotsStr} @${price.toFixed(precision)}`;\n    }\n\n    if (level.type === 'position') return level.text ?? '';\n    return level.text ?? level.label;\n}\n\n/**\n * Assigns a per-bracket start X so that bracket info-boxes (centered on each\n * bracket line) never overlap each other.\n *\n * Three columns are tried in order: 50 %, 40 %, 60 % of chartW.\n * Each column tracks the Y of the last box placed in it; a bracket is placed\n * in the first column where there is enough vertical clearance.\n */\nfunction computeBracketLineX(\n    levels: AnyLevel[],\n    scale: ScaleManager,\n    priceRange: PriceRange,\n    priceH: number,\n    chartW: number,\n    draggingLabel: string | null,\n    dragNewPrice: number | null,\n    hoveredLabel: string | null,\n    selectedLabel: string | null,\n    bracketBoxH: number = BRACKET_BOX_H,\n): Map<string, number> {\n    type BH = AnyLevel & { stopLossPrice?: number; takeProfitPrice?: number };\n\n    const items: Array<{ key: string; y: number }> = [];\n\n    for (const level of levels) {\n        // Only include brackets for hovered or selected levels\n        if (level.label !== hoveredLabel && level.label !== selectedLabel) continue;\n        const bh = level as BH;\n        if (bh.stopLossPrice !== undefined) {\n            const key = `${level.label}:stopLoss`;\n            const isDrag = draggingLabel === key;\n            const price = isDrag && dragNewPrice !== null ? dragNewPrice : bh.stopLossPrice;\n            items.push({ key, y: scale.yToPixel(price, priceRange, priceH) });\n        }\n        if (bh.takeProfitPrice !== undefined) {\n            const key = `${level.label}:takeProfit`;\n            const isDrag = draggingLabel === key;\n            const price = isDrag && dragNewPrice !== null ? dragNewPrice : bh.takeProfitPrice;\n            items.push({ key, y: scale.yToPixel(price, priceRange, priceH) });\n        }\n    }\n\n    items.sort((a, b) => a.y - b.y);\n\n    const baseX = chartW * BRACKET_BASE_RATIO;\n    const columns = BRACKET_COL_OFFSETS.map((o) => baseX + o * chartW);\n    const colLastY = columns.map(() => -Infinity);\n    const result = new Map<string, number>();\n\n    for (const item of items) {\n        let assigned = false;\n        for (let c = 0; c < columns.length; c++) {\n            if (item.y >= colLastY[c] + bracketBoxH) {\n                result.set(item.key, columns[c]);\n                colLastY[c] = item.y;\n                assigned = true;\n                break;\n            }\n        }\n        if (!assigned) {\n            const best = colLastY.indexOf(Math.min(...colLastY));\n            result.set(item.key, columns[best]);\n            colLastY[best] = item.y;\n        }\n    }\n\n    return result;\n}\n\n/**\n * Parse a CSS color string (#rgb, #rrggbb, #rrggbbaa, rgb(...), rgba(...))\n * and decide if it is perceptually light using sRGB luminance.\n * Unrecognized strings are treated as light (matches prior default-light behavior).\n */\nfunction isLightColor(color: string): boolean {\n    const s = color.trim();\n    let r = -1, g = -1, b = -1;\n\n    if (s.startsWith('#')) {\n        const hex = s.slice(1);\n        if (hex.length === 3 || hex.length === 4) {\n            r = parseInt(hex[0] + hex[0], 16);\n            g = parseInt(hex[1] + hex[1], 16);\n            b = parseInt(hex[2] + hex[2], 16);\n        } else if (hex.length === 6 || hex.length === 8) {\n            r = parseInt(hex.slice(0, 2), 16);\n            g = parseInt(hex.slice(2, 4), 16);\n            b = parseInt(hex.slice(4, 6), 16);\n        }\n    } else {\n        const m = s.match(/rgba?\\(\\s*([\\d.]+)[\\s,]+([\\d.]+)[\\s,]+([\\d.]+)/i);\n        if (m) {\n            r = parseFloat(m[1]);\n            g = parseFloat(m[2]);\n            b = parseFloat(m[3]);\n        }\n    }\n\n    if (r < 0 || g < 0 || b < 0 || Number.isNaN(r) || Number.isNaN(g) || Number.isNaN(b)) {\n        return true;\n    }\n    const luminance = (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255;\n    return luminance >= 0.5;\n}\n\n/** White on dark themes, black on light themes. */\nfunction monoColor(theme: ChartTheme): string {\n    return isLightColor(theme.background) ? '#000000' : '#ffffff';\n}\n\n/** Resolve box background color for a level. */\nfunction monoBoxBg(theme: ChartTheme, active: boolean): string {\n    const isDark = !isLightColor(theme.background);\n    if (isDark) return active ? 'rgb(30,30,30)' : 'rgb(0,0,0)';\n    return active ? 'rgb(230,230,230)' : 'rgb(255,255,255)';\n}\n\n/** Resolve line + box color for a level. */\nfunction levelColor(level: AnyLevel, colors: ChartTheme['tradeLevels'], theme: ChartTheme): string {\n    if (level.type === 'position') {\n        const pos = level as PositionLevel;\n        if (pos.entryPriceEditable && pos.side) {\n            return pos.side === 'buy' ? colors.pendingBuyLine : colors.pendingSellLine;\n        }\n        const pnl = (level as { pnl?: number }).pnl;\n        if (pnl !== undefined) return pnl >= 0 ? theme.candle.up : theme.candle.down;\n        return colors.positionLine;\n    }\n    if (level.type === 'pending') {\n        const p = level as PendingOrderLevel;\n        return p.side === 'buy' ? colors.pendingBuyLine : colors.pendingSellLine;\n    }\n    return colors.tradeLine;\n}\n\n/**\n * Whether this level's main line gets a drag handle.\n * - pending:                          always draggable (entry price can be moved)\n * - position + entryPriceEditable:    draggable (e.g. Entry Limit / Entry Stop orders)\n * - position (normal):                never draggable (entry price is fixed)\n * - trade:                            never\n */\nfunction isDraggable(level: AnyLevel): boolean {\n    if (level.type === 'pending') return true;\n    if (level.type === 'position')\n        return !!(level as import('../core/types.js').PositionLevel).entryPriceEditable;\n    return false;\n}\n\n/**\n * Renders all trade/position horizontal levels on the given canvas context.\n */\nexport function renderTradeLevels(\n    ctx: CanvasRenderingContext2D,\n    levels: AnyLevel[],\n    scale: ScaleManager,\n    priceRange: PriceRange,\n    theme: ChartTheme,\n    chartW: number,\n    priceH: number,\n    precision: number,\n    hoveredLabel: string | null = null,\n    draggingLabel: string | null = null,\n    dragNewPrice: number | null = null,\n    selectedLabel: string | null = null,\n    pendingLabels: ReadonlySet<string> = new Set(),\n    positionStyle: PositionRenderStyle = 'line',\n    hideConfirmCancel: boolean = false,\n    draftOrderLabel: string | null = null,\n    draftBracketPnl: { sl?: string; tp?: string } = {},\n    expandedClusters: ReadonlySet<string> = new Set(),\n    clusterThresholdPx: number = 0,\n    showQuantityField: boolean = false,\n    /** Derived SL price preview during an entry drag in follow-brackets mode. */\n    dragNewSLPrice: number | null = null,\n    /** Derived TP price preview during an entry drag in follow-brackets mode. */\n    dragNewTPPrice: number | null = null,\n    /**\n     * Multiplier for the Confirm/Cancel/Edit/Close button radii and gaps.\n     * Scales both visuals and hit-rects so touch targets grow together. Clamped [1, 3].\n     */\n    buttonScale: number = 1,\n    /**\n     * When true, render SL/TP bracket lines + price pills for every level, even\n     * when not hovered/selected. Close (×) buttons remain hover-only so the\n     * always-visible state stays uncluttered.\n     */\n    alwaysShowBrackets: boolean = false,\n): TradeLevelRenderResult {\n    if (levels.length === 0)\n        return {\n            hitAreas: [],\n            editAreas: [],\n            hoverAreas: [],\n            dragAreas: [],\n            confirmAreas: [],\n            addBracketAreas: [],\n            clusterBadgeAreas: [],\n            clusters: [],\n        };\n\n    const colors = theme.tradeLevels;\n\n    // Scaled button dimensions — radii and inter-button gaps grow with buttonScale\n    // so visual size AND hit-rects scale together. Box padding stays unscaled.\n    const s = Math.min(Math.max(buttonScale, 1), 3);\n    const closeR = CLOSE_R * s;\n    const editR = EDIT_R * s;\n    const confirmR = CONFIRM_R * s;\n    const editGap = EDIT_GAP * s;\n    const confirmGap = CONFIRM_GAP * s;\n\n    // Box height must grow to contain the largest button diameter so scaled circles\n    // don't spill above/below the info box.\n    const maxBtnR = Math.max(closeR, editR, confirmR);\n    const boxH = Math.max(ROW_H + BOX_PAD_Y * 2, maxBtnR * 2 + BOX_PAD_Y * 2);\n    // Bracket box height — used for vertical-stacking collision checks below.\n    const bracketBoxH = Math.max(BRACKET_BOX_H, closeR * 2 + BRACKET_BOX_PAD_Y * 2);\n\n    ctx.save();\n    ctx.font = FONT_MAIN;\n\n    // ── Phase 1: compute pixel y and measure box dimensions ───────────────────\n    const measured: Array<{\n        level: AnyLevel;\n        price: number;\n        y: number;\n        boxW: number;\n        boxH: number;\n    }> = [];\n\n    for (const level of levels) {\n        // Use drag-overridden price during active drag\n        const price =\n            draggingLabel === level.label && dragNewPrice !== null ? dragNewPrice : level.price;\n\n        const y = scale.yToPixel(price, priceRange, priceH);\n        if (y < -40 || y > priceH + 40) continue;\n\n        // Dot style for positions — no box measurement needed unless selected (renders as full line)\n        if (positionStyle === 'dot' && level.type === 'position' && level.label !== selectedLabel) {\n            measured.push({ level, price, y, boxW: 0, boxH: 0 });\n            continue;\n        }\n\n        // Market draft — no entry line or info box, only brackets rendered\n        const isMarketDraft =\n            level.type === 'pending' &&\n            (level as PendingOrderLevel).orderType === 'market' &&\n            (level.data as { _isDraft?: boolean } | undefined)?._isDraft === true;\n        if (isMarketDraft) {\n            measured.push({ level, price, y, boxW: 0, boxH: 0 });\n            continue;\n        }\n\n        const pnlText = hasPnl(level) ? (level as { pnlText: string }).pnlText : null;\n        const hasPending = pendingLabels.has(level.label);\n\n        const pnlW = pnlText ? ctx.measureText(pnlText).width + PNL_GAP : 0;\n        // When pending (desktop): show ✓/✗ only (no × close). Otherwise show × close only.\n        // In mobile (hideConfirmCancel) neither button is drawn — allocate no extra space.\n        const effectivePending = hasPending && !hideConfirmCancel;\n        const confirmW = effectivePending ? (confirmR * 2 + confirmGap) * 2 : 0;\n        const closeW = effectivePending || hideConfirmCancel ? 0 : editR * 2 + editGap + closeR * 2 + BOX_PAD_X / 2;\n        const isDraftLevel = (level.data as { _isDraft?: boolean } | undefined)?._isDraft === true;\n        const isEditingLevel = level.label === selectedLabel || hasPending;\n        const isEntryOrderPosition = level.type === 'position' && (level as PositionLevel).entryPriceEditable === true;\n        const supportsQtyField = level.type === 'pending' || isEntryOrderPosition;\n        const levelLots = (level as PendingOrderLevel | PositionLevel).lots;\n        const qtyPillText = (showQuantityField && (isDraftLevel || isEditingLevel) && supportsQtyField && levelLots !== undefined)\n            ? String(levelLots)\n            : null;\n        const displayText = getLevelDisplayText(level, price, precision, qtyPillText !== null);\n        const labelW = ctx.measureText(displayText).width;\n        const pillW = qtyPillText ? PILL_PAD_X + ctx.measureText(qtyPillText).width + PILL_PAD_X + PILL_GAP : 0;\n        const bW = BOX_PAD_X + pillW + pnlW + labelW + BOX_PAD_X + confirmW + closeW;\n\n        measured.push({ level, price, y, boxW: bW, boxH });\n    }\n\n    // ── Phase 1.5: cluster detection ───────────────────────────────────────────\n    const excludeFromClustering = new Set<string>();\n    if (draftOrderLabel) excludeFromClustering.add(draftOrderLabel);\n\n    const clusters = clusterThresholdPx > 0\n        ? detectClusters(measured, clusterThresholdPx, excludeFromClustering)\n        : [];\n\n    const collapsedClusters = clusters.filter((c) => !expandedClusters.has(c.id));\n    const expandedClusterList = clusters.filter((c) => expandedClusters.has(c.id));\n\n    // Labels hidden behind a collapsed cluster badge — no individual rendering\n    const collapsedLabels = new Set<string>();\n    for (const c of collapsedClusters) {\n        for (const m of c.members) collapsedLabels.add(m.level.label);\n    }\n\n    // Fan-out layouts for expanded clusters\n    const expandedFanLayouts = new Map<string, Map<string, number>>();\n    for (const ec of expandedClusterList) {\n        expandedFanLayouts.set(ec.id, computeFanOutLayout(ec, boxH, 4));\n    }\n\n    // Reverse lookup: label → cluster (for expanded members)\n    const labelToExpandedCluster = new Map<string, LevelCluster>();\n    for (const ec of expandedClusterList) {\n        for (const m of ec.members) labelToExpandedCluster.set(m.level.label, ec);\n    }\n\n    // ── Phase 2: collision-aware vertical placement ───────────────────────────\n    measured.sort((a, b) => a.y - b.y);\n\n    const placed: Array<{ label: string; boxY: number; boxH: number }> = [];\n    const layouts = new Map<string, LevelLayout>();\n\n    for (const m of measured) {\n        // Skip levels hidden behind collapsed cluster badges\n        if (collapsedLabels.has(m.level.label)) continue;\n\n        // For expanded cluster members, use fan-out Y\n        const ec = labelToExpandedCluster.get(m.level.label);\n        if (ec) {\n            const fanMap = expandedFanLayouts.get(ec.id);\n            const fanY = fanMap?.get(m.level.label);\n            if (fanY !== undefined) {\n                placed.push({ label: m.level.label, boxY: fanY, boxH: m.boxH });\n                layouts.set(m.level.label, { price: m.price, y: m.y, boxY: fanY, boxW: m.boxW, boxH: m.boxH });\n                continue;\n            }\n        }\n\n        // Normal collision-aware placement (fixed: cascade until no overlap)\n        let boxY = m.y - m.boxH / 2;\n        let attempts = 0;\n        while (attempts < placed.length + 1) {\n            const overlaps = placed.some((p) => rectsOverlapY(boxY, m.boxH, p.boxY, p.boxH));\n            if (!overlaps) break;\n            boxY -= m.boxH + 2;\n            attempts++;\n        }\n\n        placed.push({ label: m.level.label, boxY, boxH: m.boxH });\n        layouts.set(m.level.label, { price: m.price, y: m.y, boxY, boxW: m.boxW, boxH: m.boxH });\n    }\n\n    // ── Phase 3: bracket lineX column assignments ─────────────────────────────\n    const bracketLineXMap = computeBracketLineX(\n        levels,\n        scale,\n        priceRange,\n        priceH,\n        chartW,\n        draggingLabel,\n        dragNewPrice,\n        hoveredLabel,\n        selectedLabel,\n        bracketBoxH,\n    );\n\n    // ── Phase 3b: bracket pill vertical-cascade away from entry pill ──────────\n    // When an SL/TP price sits within one pill-height of the entry price, the\n    // bracket pill (and its drag-rect) would overlap the entry pill. Push the\n    // bracket pill vertically *away from the entry* (direction = sign of the\n    // bracket's real-Y minus the entry's real-Y) until clear. Draw time uses\n    // this displaced boxY and emits a short dashed leader back to the real y.\n    type BracketItem = {\n        key: string;\n        label: string;\n        y: number; // real line y\n        columnX: number;\n    };\n    const bracketItems: BracketItem[] = [];\n    type BH = AnyLevel & { stopLossPrice?: number; takeProfitPrice?: number };\n    const fallbackX = chartW * BRACKET_BASE_RATIO;\n    for (const level of levels) {\n        if (level.label !== hoveredLabel && level.label !== selectedLabel) continue;\n        const bh = level as BH;\n        const mainDrag = draggingLabel === level.label;\n        if (bh.stopLossPrice !== undefined) {\n            const key = `${level.label}:stopLoss`;\n            const ownDrag = draggingLabel === key;\n            const price = ownDrag && dragNewPrice !== null\n                ? dragNewPrice\n                : mainDrag && dragNewSLPrice !== null\n                    ? dragNewSLPrice\n                    : bh.stopLossPrice;\n            bracketItems.push({\n                key,\n                label: level.label,\n                y: scale.yToPixel(price, priceRange, priceH),\n                columnX: bracketLineXMap.get(key) ?? fallbackX,\n            });\n        }\n        if (bh.takeProfitPrice !== undefined) {\n            const key = `${level.label}:takeProfit`;\n            const ownDrag = draggingLabel === key;\n            const price = ownDrag && dragNewPrice !== null\n                ? dragNewPrice\n                : mainDrag && dragNewTPPrice !== null\n                    ? dragNewTPPrice\n                    : bh.takeProfitPrice;\n            bracketItems.push({\n                key,\n                label: level.label,\n                y: scale.yToPixel(price, priceRange, priceH),\n                columnX: bracketLineXMap.get(key) ?? fallbackX,\n            });\n        }\n    }\n    bracketItems.sort((a, b) => a.y - b.y);\n\n    const bracketBoxYMap = new Map<string, number>();\n    const placedBrackets: Array<{ columnX: number; boxY: number; boxH: number }> = [];\n    for (const item of bracketItems) {\n        const entry = layouts.get(item.label);\n        const preferredBoxY = item.y - bracketBoxH / 2;\n        const entryRect = entry ? { boxY: entry.boxY, boxH: entry.boxH } : null;\n        const dir = entry ? (Math.sign(item.y - entry.y) || 1) : 1;\n        const sameColObstacles = placedBrackets.filter((p) => p.columnX === item.columnX);\n        const newBoxY = cascadeBracketAwayFromEntry(\n            entryRect,\n            preferredBoxY,\n            bracketBoxH,\n            dir as 1 | -1,\n            sameColObstacles,\n        );\n        bracketBoxYMap.set(item.key, newBoxY);\n        placedBrackets.push({ columnX: item.columnX, boxY: newBoxY, boxH: bracketBoxH });\n    }\n\n    // ── Phase 4: two-pass draw (hovered/selected level drawn last = on top) ───\n    const activeLabel = hoveredLabel ?? selectedLabel;\n    const bracketPnlHostLabel = draftOrderLabel ?? selectedLabel;\n    // Only draw non-collapsed levels\n    const visibleMeasured = measured.filter((m) => !collapsedLabels.has(m.level.label));\n    const drawOrder = [\n        ...visibleMeasured.filter((m) => m.level.label !== activeLabel),\n        ...visibleMeasured.filter((m) => m.level.label === activeLabel),\n    ];\n\n    const hitAreas: TradeLevelHitArea[] = [];\n    const editAreas: TradeLevelHitArea[] = [];\n    const hoverAreas: TradeHoverArea[] = [];\n    const dragAreas: AnyDragArea[] = [];\n    const confirmAreas: TradeLevelConfirmArea[] = [];\n    const addBracketAreas: TradeAddBracketArea[] = [];\n    const clusterBadgeAreas: ClusterBadgeHitArea[] = [];\n    const draftQtyPillAreas: DraftQtyPillArea[] = [];\n\n    // 4a: Draw collapsed cluster badges (faint member lines + badge pill)\n    for (const cluster of collapsedClusters) {\n        drawClusterBadge(ctx, cluster, chartW, theme, clusterBadgeAreas);\n    }\n\n    // 4b: Draw individual levels (unclustered + expanded cluster members)\n    for (const { level } of drawOrder) {\n        const layout = layouts.get(level.label);\n        if (!layout) continue;\n\n        drawLevel(\n            ctx,\n            level,\n            layout,\n            chartW,\n            colors,\n            theme,\n            precision,\n            level.label === hoveredLabel,\n            level.label === selectedLabel,\n            scale,\n            priceRange,\n            priceH,\n            draggingLabel,\n            dragNewPrice,\n            bracketLineXMap,\n            pendingLabels.has(level.label),\n            positionStyle,\n            hitAreas,\n            editAreas,\n            hoverAreas,\n            dragAreas,\n            confirmAreas,\n            addBracketAreas,\n            hideConfirmCancel,\n            level.label === bracketPnlHostLabel ? draftBracketPnl : undefined,\n            showQuantityField,\n            draftQtyPillAreas,\n            dragNewSLPrice,\n            dragNewTPPrice,\n            buttonScale,\n            bracketBoxYMap,\n            alwaysShowBrackets,\n        );\n\n        // Draw connector line for expanded cluster members (from fanned box to actual price)\n        const ec = labelToExpandedCluster.get(level.label);\n        if (ec && layout.boxY !== layout.y - boxH / 2) {\n            drawFanConnector(ctx, layout.boxY + boxH / 2, layout.y, chartW, theme);\n        }\n    }\n\n    // ── Phase 5: bracket-only pass for selected level whose entry is off-viewport ──\n    // When a level is selected but its entry price is outside the visible range,\n    // Phase 1 skips it entirely. We still need to render its SL/TP bracket lines\n    // so the user can see the brackets they scrolled into view via the off-viewport pill.\n    if (selectedLabel !== null && !layouts.has(selectedLabel)) {\n        const offLevel = levels.find((l) => l.label === selectedLabel);\n        if (offLevel) {\n            type BracketHost = AnyLevel & {\n                stopLossPrice?: number;\n                takeProfitPrice?: number;\n                _slOrderLabel?: string;\n                _tpOrderLabel?: string;\n            };\n            const bh = offLevel as BracketHost;\n            const slDragKey = `${offLevel.label}:stopLoss`;\n            const tpDragKey = `${offLevel.label}:takeProfit`;\n            // Follow-brackets preview carries over to the off-viewport path too.\n            const offMainDragActive = draggingLabel === offLevel.label;\n            const offSlPrice =\n                offMainDragActive && dragNewSLPrice !== null\n                    ? dragNewSLPrice\n                    : bh.stopLossPrice;\n            const offTpPrice =\n                offMainDragActive && dragNewTPPrice !== null\n                    ? dragNewTPPrice\n                    : bh.takeProfitPrice;\n\n            if (offSlPrice !== undefined && offTpPrice !== undefined) {\n                const slY = scale.yToPixel(offSlPrice, priceRange, priceH);\n                const tpY = scale.yToPixel(offTpPrice, priceRange, priceH);\n                const bracketBH = Math.max(BRACKET_BOX_H, CLOSE_R * 2 + BRACKET_BOX_PAD_Y * 2);\n                ctx.save();\n                ctx.font = FONT_BRACKET;\n                const closeSlot = CLOSE_R * 2 + BRACKET_BOX_PAD_X / 2;\n                const slBW = BRACKET_BOX_PAD_X + ctx.measureText(`SL ${offSlPrice.toFixed(precision)}`).width + BRACKET_BOX_PAD_X + closeSlot;\n                const tpBW = BRACKET_BOX_PAD_X + ctx.measureText(`TP ${offTpPrice.toFixed(precision)}`).width + BRACKET_BOX_PAD_X + closeSlot;\n                ctx.restore();\n                const connX = (((bracketLineXMap.get(slDragKey) ?? fallbackX) - slBW / 2 - 2) + ((bracketLineXMap.get(tpDragKey) ?? fallbackX) - tpBW / 2 - 2)) / 2;\n                const slPillY = bracketBoxYMap.get(slDragKey) ?? (slY - bracketBH / 2);\n                const tpPillY = bracketBoxYMap.get(tpDragKey) ?? (tpY - bracketBH / 2);\n                const [upperY, lowerY] = tpPillY < slPillY ? [tpPillY, slPillY] : [slPillY, tpPillY];\n                drawSLTPConnector(ctx, connX, upperY + bracketBH, lowerY, theme);\n            }\n\n            if (offSlPrice !== undefined) {\n                drawBracketLine(\n                    ctx, bh as PendingOrderLevel, 'stopLoss', offSlPrice,\n                    scale, priceRange, priceH,\n                    bracketLineXMap.get(slDragKey) ?? fallbackX,\n                    chartW, theme, precision, draggingLabel, dragNewPrice,\n                    hitAreas, dragAreas, hideConfirmCancel, bh._slOrderLabel,\n                    undefined, buttonScale, bracketBoxYMap.get(slDragKey)\n                );\n            }\n            if (offTpPrice !== undefined) {\n                drawBracketLine(\n                    ctx, bh as PendingOrderLevel, 'takeProfit', offTpPrice,\n                    scale, priceRange, priceH,\n                    bracketLineXMap.get(tpDragKey) ?? fallbackX,\n                    chartW, theme, precision, draggingLabel, dragNewPrice,\n                    hitAreas, dragAreas, hideConfirmCancel, bh._tpOrderLabel,\n                    undefined, buttonScale, bracketBoxYMap.get(tpDragKey)\n                );\n            }\n        }\n    }\n\n    ctx.restore();\n    return {\n        hitAreas, editAreas, hoverAreas, dragAreas, confirmAreas,\n        addBracketAreas, clusterBadgeAreas, clusters,\n        draftQtyPillArea: draftQtyPillAreas[0],\n    };\n}\n\n// ── Cluster badge & fan-out connector helpers ─────────────────────────────────\n\nconst BADGE_FONT = \"bold 12px 'Inter', system-ui, sans-serif\";\nconst BADGE_PAD_X = 12;\nconst BADGE_H = 24;\nconst BADGE_RADIUS = 12;\n\n/**\n * Draws a cluster badge pill for a collapsed cluster and registers its hit area.\n * Also draws faint horizontal lines at each member's actual Y position.\n */\nfunction drawClusterBadge(\n    ctx: CanvasRenderingContext2D,\n    cluster: LevelCluster,\n    chartW: number,\n    theme: ChartTheme,\n    clusterBadgeAreas: ClusterBadgeHitArea[]\n): void {\n    const mono = monoColor(theme);\n    const isDark = !isLightColor(theme.background);\n\n    // Draw faint horizontal lines for each member at their real Y\n    ctx.save();\n    ctx.strokeStyle = mono;\n    ctx.globalAlpha = 0.12;\n    ctx.lineWidth = 1;\n    ctx.setLineDash([4, 4]);\n    for (const m of cluster.members) {\n        ctx.beginPath();\n        ctx.moveTo(0, m.y);\n        ctx.lineTo(chartW, m.y);\n        ctx.stroke();\n    }\n    ctx.setLineDash([]);\n    ctx.restore();\n\n    // Compute badge layout\n    ctx.save();\n    ctx.font = BADGE_FONT;\n    const layout = buildClusterBadgeLayout(cluster, chartW, ctx);\n    const { badgeX, badgeY, badgeW, text } = layout;\n    const expandIcon = ' \\u25B8'; // ▸\n\n    // Draw badge pill background\n    const bgColor = isDark ? 'rgba(40,40,40,0.92)' : 'rgba(240,240,240,0.92)';\n    ctx.fillStyle = bgColor;\n    ctx.beginPath();\n    ctx.roundRect(badgeX, badgeY, badgeW, BADGE_H, BADGE_RADIUS);\n    ctx.fill();\n\n    // Draw badge border\n    ctx.strokeStyle = mono;\n    ctx.globalAlpha = 0.3;\n    ctx.lineWidth = 1;\n    ctx.stroke();\n    ctx.globalAlpha = 1;\n\n    // Draw badge text\n    ctx.fillStyle = mono;\n    ctx.globalAlpha = 0.85;\n    ctx.textBaseline = 'middle';\n    ctx.textAlign = 'left';\n    ctx.fillText(text + expandIcon, badgeX + BADGE_PAD_X, badgeY + BADGE_H / 2);\n    ctx.globalAlpha = 1;\n    ctx.restore();\n\n    // Register hit area\n    clusterBadgeAreas.push({\n        clusterId: cluster.id,\n        x: badgeX,\n        y: badgeY,\n        w: badgeW,\n        h: BADGE_H,\n    });\n}\n\n/**\n * Draws a thin dotted connector line from a fanned-out box center back to\n * the actual price line Y on the right side of the chart.\n */\nfunction drawFanConnector(\n    ctx: CanvasRenderingContext2D,\n    fanCenterY: number,\n    realY: number,\n    chartW: number,\n    theme: ChartTheme\n): void {\n    if (Math.abs(fanCenterY - realY) < 2) return; // too close, skip\n    const mono = monoColor(theme);\n    ctx.save();\n    ctx.strokeStyle = mono;\n    ctx.globalAlpha = 0.25;\n    ctx.lineWidth = 1;\n    ctx.setLineDash([2, 3]);\n    // Draw from right edge of chart back to price line\n    const connectorX = chartW - 8;\n    ctx.beginPath();\n    ctx.moveTo(connectorX, fanCenterY);\n    ctx.lineTo(connectorX, realY);\n    ctx.stroke();\n    // Small tick mark at real Y\n    ctx.setLineDash([]);\n    ctx.beginPath();\n    ctx.moveTo(connectorX - 4, realY);\n    ctx.lineTo(connectorX + 4, realY);\n    ctx.stroke();\n    ctx.restore();\n}\n\nfunction drawSLTPConnector(\n    ctx: CanvasRenderingContext2D,\n    x: number,\n    yTop: number,\n    yBottom: number,\n    theme: ChartTheme,\n): void {\n    if (yBottom - yTop < 2) return;\n    ctx.save();\n    ctx.strokeStyle = monoColor(theme);\n    ctx.globalAlpha = 0.5;\n    ctx.lineWidth = 1;\n    ctx.setLineDash([3, 4]);\n    ctx.beginPath();\n    ctx.moveTo(x, yTop);\n    ctx.lineTo(x, yBottom);\n    ctx.stroke();\n    ctx.setLineDash([]);\n    ctx.restore();\n}\n\n/**\n * Compact hover tooltip drawn to the left of the dot when the user is hovering\n * but has not yet selected the level. Shows: entry price, SL (if any), TP (if any).\n */\nfunction drawDotHoverBox(\n    ctx: CanvasRenderingContext2D,\n    level: AnyLevel,\n    y: number,\n    dotX: number,\n    dotR: number,\n    theme: ChartTheme,\n    precision: number\n): void {\n    type PL = {\n        pnl?: number;\n        pnlText?: string;\n        side?: 'buy' | 'sell';\n        lots?: number;\n        orderType?: 'limit' | 'stop';\n    };\n    const pl = level as PL;\n\n    const rows: Array<{ label: string; value: string; pnlColor?: string }> = [];\n\n    // ES/EL orders share level.type === 'position' but have orderType set — show Price/SL/TP for those\n    type PLBrackets = { stopLossPrice?: number; takeProfitPrice?: number };\n    const brackets = level as PLBrackets;\n    if (pl.orderType !== undefined) {\n        rows.push({ label: 'Price', value: level.price.toFixed(precision) });\n        if (brackets.stopLossPrice !== undefined)\n            rows.push({ label: 'SL', value: brackets.stopLossPrice.toFixed(precision) });\n        if (brackets.takeProfitPrice !== undefined)\n            rows.push({ label: 'TP', value: brackets.takeProfitPrice.toFixed(precision) });\n    } else {\n        // True open position — show PnL, Side, Lots\n        if (pl.pnlText !== undefined) {\n            const pnlColor =\n                pl.pnl !== undefined\n                    ? pl.pnl >= 0\n                        ? theme.candle.up\n                        : theme.candle.down\n                    : undefined;\n            rows.push({ label: 'PnL', value: pl.pnlText, pnlColor });\n        }\n        if (pl.side !== undefined) {\n            rows.push({ label: 'Side', value: pl.side === 'buy' ? 'Buy' : 'Sell' });\n        }\n        if (pl.lots !== undefined) {\n            rows.push({ label: 'Lots', value: String(pl.lots) });\n        }\n        // Fallback when none of the position fields are populated\n        if (rows.length === 0) {\n            rows.push({ label: 'Price', value: level.price.toFixed(precision) });\n        }\n    }\n\n    const PAD_X = BOX_PAD_X;\n    const PAD_Y = BOX_PAD_Y;\n    const ROW_H_TT = ROW_H + 3;\n\n    ctx.save();\n    ctx.font = FONT_MAIN;\n\n    // Measure widest label column and widest value column separately for alignment\n    const labelW = Math.max(...rows.map((r) => ctx.measureText(r.label).width));\n    const valueW = Math.max(...rows.map((r) => ctx.measureText(r.value).width));\n    const colGap = 8;\n    const boxW = PAD_X + labelW + colGap + valueW + PAD_X;\n    const boxH = PAD_Y + rows.length * ROW_H_TT - 3 + PAD_Y;\n\n    // Position to the left of the dot\n    const boxRight = dotX - dotR - 8;\n    const boxX = boxRight - boxW;\n    const boxY = y - boxH / 2;\n\n    ctx.fillStyle = monoBoxBg(theme, true);\n    ctx.strokeStyle = monoColor(theme);\n    ctx.lineWidth = 1;\n    roundRect(ctx, boxX, boxY, boxW, boxH, BOX_RADIUS);\n    ctx.fill();\n    ctx.stroke();\n\n    ctx.textBaseline = 'top';\n    rows.forEach((row, i) => {\n        const rowY = boxY + PAD_Y + i * ROW_H_TT;\n        ctx.textAlign = 'left';\n        ctx.fillStyle = monoColor(theme);\n        ctx.globalAlpha = 0.55;\n        ctx.fillText(row.label, boxX + PAD_X, rowY);\n        ctx.globalAlpha = 1;\n        ctx.textAlign = 'right';\n        ctx.fillStyle = row.pnlColor ?? monoColor(theme);\n        ctx.fillText(row.value, boxX + PAD_X + labelW + colGap + valueW, rowY);\n    });\n\n    ctx.restore();\n}\n\nfunction drawLevel(\n    ctx: CanvasRenderingContext2D,\n    level: AnyLevel,\n    layout: LevelLayout,\n    chartW: number,\n    colors: ChartTheme['tradeLevels'],\n    theme: ChartTheme,\n    precision: number,\n    hovered: boolean,\n    selected: boolean,\n    scale: ScaleManager,\n    priceRange: PriceRange,\n    priceH: number,\n    draggingLabel: string | null,\n    dragNewPrice: number | null,\n    bracketLineXMap: Map<string, number>,\n    hasPendingChanges: boolean,\n    positionStyle: PositionRenderStyle,\n    hitAreas: TradeLevelHitArea[],\n    editAreas: TradeLevelHitArea[],\n    hoverAreas: TradeHoverArea[],\n    dragAreas: AnyDragArea[],\n    confirmAreas: TradeLevelConfirmArea[],\n    addBracketAreas: TradeAddBracketArea[],\n    hideConfirmCancel: boolean = false,\n    draftBracketPnl?: { sl?: string; tp?: string },\n    showQuantityField: boolean = false,\n    draftQtyPillAreas?: DraftQtyPillArea[],\n    /** Derived SL preview during an entry drag in follow-brackets mode (only for the dragged level). */\n    dragNewSLPrice: number | null = null,\n    /** Derived TP preview during an entry drag in follow-brackets mode (only for the dragged level). */\n    dragNewTPPrice: number | null = null,\n    /** Scaled button radii/gaps (pre-clamped). Pass `1` for default sizing. */\n    buttonScale: number = 1,\n    /** Phase-3b displaced bracket box-Y, keyed by `${label}:${bracketType}`. */\n    bracketBoxYMap?: Map<string, number>,\n    /** When true, render brackets even when not hovered/selected (close buttons stay hover-only). */\n    alwaysShowBrackets: boolean = false,\n): void {\n    const { y, boxY, boxW, boxH } = layout;\n    const color = levelColor(level, colors, theme);\n    const active = hovered || selected;\n    // When brackets are shown via the always-flag (no hover/selection), suppress\n    // the close (×) button so the chart stays uncluttered until the user acts.\n    const passiveBracketShow = alwaysShowBrackets && !active;\n    const effectiveHideConfirmCancel = hideConfirmCancel || passiveBracketShow;\n\n    // Scaled button dimensions — mirror the locals derived in renderTradeLevels\n    const s = Math.min(Math.max(buttonScale, 1), 3);\n    const closeR = CLOSE_R * s;\n    const editR = EDIT_R * s;\n    const confirmR = CONFIRM_R * s;\n    const editGap = EDIT_GAP * s;\n    const confirmGap = CONFIRM_GAP * s;\n\n    // ── Dot style for position levels ─────────────────────────────────────────\n    // When selected, fall through to full line rendering so close/bracket UI appears.\n    if (positionStyle === 'dot' && level.type === 'position' && !selected) {\n        const dotR = 6;\n        const dotX = chartW - dotR - 4;\n\n        // Hover tooltip: Price / SL / TP — drawn before dot so dot renders on top\n        if (hovered) {\n            drawDotHoverBox(ctx, level, y, dotX, dotR, theme, precision);\n        }\n\n        ctx.save();\n        ctx.fillStyle = color;\n        ctx.globalAlpha = hovered ? 1 : 0.75;\n        ctx.beginPath();\n        ctx.arc(dotX, y, dotR, 0, Math.PI * 2);\n        ctx.fill();\n        ctx.globalAlpha = 1;\n        ctx.restore();\n\n        hoverAreas.push({\n            label: level.label,\n            boxX: dotX - dotR,\n            boxY: y - dotR,\n            boxW: dotR * 2,\n            boxH: dotR * 2,\n            lineX: dotX - dotR,\n            lineY: y - dotR,\n            lineW: dotR * 2,\n            lineH: dotR * 2,\n        });\n        return;\n    }\n\n    const pnlText = hasPnl(level) ? (level as { pnlText: string }).pnlText : null;\n    const pnl = level.type === 'position' ? (level as { pnl?: number }).pnl : undefined;\n    const isPending = level.type === 'pending';\n\n    // Market draft — only brackets are drawn; no entry line, no info box, no buttons\n    const isMarketDraft =\n        isPending &&\n        (level as PendingOrderLevel).orderType === 'market' &&\n        (level.data as { _isDraft?: boolean } | undefined)?._isDraft === true;\n\n    const draggable = isDraggable(level);\n    // Center the grip+box group horizontally on the chart\n    const groupW = (draggable ? GRIP_W + 2 : 0) + boxW;\n    const groupX = Math.round((chartW - groupW) / 2);\n    const gripX = draggable ? groupX : 0;\n    const boxX = draggable ? groupX + GRIP_W + 2 : groupX;\n\n    // ── Bracket lines (SL / TP) — only when hovered or selected (always for market draft) ──\n    type BracketHost = AnyLevel & {\n        stopLossPrice?: number;\n        takeProfitPrice?: number;\n        side?: 'buy' | 'sell';\n        _slOrderLabel?: string;\n        _tpOrderLabel?: string;\n    };\n    const bracketHost = level as BracketHost;\n\n    // Market drafts always show brackets regardless of hover/selection state.\n    // When `alwaysShowBrackets` is set, every level renders brackets too —\n    // close buttons are suppressed via `effectiveHideConfirmCancel` while passive.\n    if (active || isMarketDraft || passiveBracketShow) {\n        const slDragKey = `${level.label}:stopLoss`;\n        const tpDragKey = `${level.label}:takeProfit`;\n\n        // Follow-brackets preview: when the entry line of THIS level is being dragged,\n        // render SL/TP at their delta-adjusted positions so they track entry live.\n        const mainDragActive = draggingLabel === level.label;\n        const slRenderPrice =\n            mainDragActive && dragNewSLPrice !== null\n                ? dragNewSLPrice\n                : bracketHost.stopLossPrice;\n        const tpRenderPrice =\n            mainDragActive && dragNewTPPrice !== null\n                ? dragNewTPPrice\n                : bracketHost.takeProfitPrice;\n\n        // Dotted vertical connector between pill boxes — only when selected and both brackets exist\n        if (selected && slRenderPrice !== undefined && tpRenderPrice !== undefined) {\n            const slY = scale.yToPixel(slRenderPrice, priceRange, priceH);\n            const tpY = scale.yToPixel(tpRenderPrice, priceRange, priceH);\n            const bracketBH = hideConfirmCancel\n                ? BRACKET_BOX_H\n                : Math.max(BRACKET_BOX_H, closeR * 2 + BRACKET_BOX_PAD_Y * 2);\n            ctx.save();\n            ctx.font = FONT_BRACKET;\n            const closeSlot = hideConfirmCancel ? 0 : closeR * 2 + BRACKET_BOX_PAD_X / 2;\n            const slBW = BRACKET_BOX_PAD_X + ctx.measureText(`SL ${slRenderPrice.toFixed(precision)}`).width + BRACKET_BOX_PAD_X + closeSlot;\n            const tpBW = BRACKET_BOX_PAD_X + ctx.measureText(`TP ${tpRenderPrice.toFixed(precision)}`).width + BRACKET_BOX_PAD_X + closeSlot;\n            ctx.restore();\n            const slBLineX = bracketLineXMap.get(slDragKey) ?? chartW * BRACKET_BASE_RATIO;\n            const tpBLineX = bracketLineXMap.get(tpDragKey) ?? chartW * BRACKET_BASE_RATIO;\n            const connX = ((slBLineX - slBW / 2 - 2) + (tpBLineX - tpBW / 2 - 2)) / 2;\n            const slPillY = bracketBoxYMap?.get(slDragKey) ?? (slY - bracketBH / 2);\n            const tpPillY = bracketBoxYMap?.get(tpDragKey) ?? (tpY - bracketBH / 2);\n            const [upperY, lowerY] = tpPillY < slPillY ? [tpPillY, slPillY] : [slPillY, tpPillY];\n            drawSLTPConnector(ctx, connX, upperY + bracketBH, lowerY, theme);\n        }\n\n        if (slRenderPrice !== undefined) {\n            const bLineX = bracketLineXMap.get(slDragKey) ?? chartW * BRACKET_BASE_RATIO;\n            drawBracketLine(\n                ctx,\n                bracketHost as PendingOrderLevel,\n                'stopLoss',\n                slRenderPrice,\n                scale,\n                priceRange,\n                priceH,\n                bLineX,\n                chartW,\n                theme,\n                precision,\n                draggingLabel,\n                dragNewPrice,\n                hitAreas,\n                dragAreas,\n                effectiveHideConfirmCancel,\n                bracketHost._slOrderLabel,\n                draftBracketPnl?.sl,\n                buttonScale,\n                bracketBoxYMap?.get(slDragKey)\n            );\n        } else if (draggingLabel === slDragKey && dragNewPrice !== null) {\n            // New SL being placed via +SL button — draw draft line at drag price\n            const bLineX = chartW * BRACKET_BASE_RATIO;\n            drawBracketLine(\n                ctx,\n                bracketHost as PendingOrderLevel,\n                'stopLoss',\n                dragNewPrice,\n                scale,\n                priceRange,\n                priceH,\n                bLineX,\n                chartW,\n                theme,\n                precision,\n                draggingLabel,\n                dragNewPrice,\n                hitAreas,\n                dragAreas,\n                effectiveHideConfirmCancel,\n                undefined,\n                draftBracketPnl?.sl,\n                buttonScale\n            );\n        }\n\n        if (tpRenderPrice !== undefined) {\n            const bLineX = bracketLineXMap.get(tpDragKey) ?? chartW * BRACKET_BASE_RATIO;\n            drawBracketLine(\n                ctx,\n                bracketHost as PendingOrderLevel,\n                'takeProfit',\n                tpRenderPrice,\n                scale,\n                priceRange,\n                priceH,\n                bLineX,\n                chartW,\n                theme,\n                precision,\n                draggingLabel,\n                dragNewPrice,\n                hitAreas,\n                dragAreas,\n                effectiveHideConfirmCancel,\n                bracketHost._tpOrderLabel,\n                draftBracketPnl?.tp,\n                buttonScale,\n                bracketBoxYMap?.get(tpDragKey)\n            );\n        } else if (draggingLabel === tpDragKey && dragNewPrice !== null) {\n            // New TP being placed via +TP button — draw draft line at drag price\n            const bLineX = chartW * BRACKET_BASE_RATIO;\n            drawBracketLine(\n                ctx,\n                bracketHost as PendingOrderLevel,\n                'takeProfit',\n                dragNewPrice,\n                scale,\n                priceRange,\n                priceH,\n                bLineX,\n                chartW,\n                theme,\n                precision,\n                draggingLabel,\n                dragNewPrice,\n                hitAreas,\n                dragAreas,\n                effectiveHideConfirmCancel,\n                undefined,\n                draftBracketPnl?.tp,\n                buttonScale\n            );\n        }\n\n        // +SL / +TP add buttons — only when selected, bracket is missing, and not currently dragging that bracket\n        if (selected && bracketHost.side !== undefined) {\n            const addLineX = chartW * BRACKET_BASE_RATIO;\n            if (bracketHost.stopLossPrice === undefined && draggingLabel !== slDragKey) {\n                drawAddBracketButton(\n                    ctx,\n                    bracketHost,\n                    'stopLoss',\n                    y,\n                    addLineX,\n                    chartW,\n                    priceH,\n                    theme,\n                    addBracketAreas\n                );\n            }\n            if (bracketHost.takeProfitPrice === undefined && draggingLabel !== tpDragKey) {\n                drawAddBracketButton(\n                    ctx,\n                    bracketHost,\n                    'takeProfit',\n                    y,\n                    addLineX,\n                    chartW,\n                    priceH,\n                    theme,\n                    addBracketAreas\n                );\n            }\n        }\n    }\n\n    // Market drafts only render brackets — skip the main line, info box, and all buttons\n    if (isMarketDraft) return;\n\n    // ── Horizontal line (full width) ──────────────────────────────────────────\n    const isEntryOrderPos = level.type === 'position' && (level as PositionLevel).entryPriceEditable === true;\n    ctx.save();\n    ctx.strokeStyle = color;\n    ctx.lineWidth = LINE_WIDTH;\n    ctx.globalAlpha = active ? 1.0 : 0.85;\n\n    if (isPending || isEntryOrderPos) {\n        ctx.setLineDash([5, 4]);\n    }\n\n    ctx.beginPath();\n    ctx.moveTo(0, y);\n    ctx.lineTo(chartW, y);\n    ctx.stroke();\n    ctx.setLineDash([]);\n    ctx.globalAlpha = 1;\n    ctx.restore();\n\n    // ── Info box ──────────────────────────────────────────────────────────────\n    const midY = boxY + boxH / 2;\n\n    ctx.save();\n\n    // Box background — monochrome (black on light theme, dark on dark theme)\n    ctx.fillStyle = monoBoxBg(theme, active);\n    ctx.strokeStyle = color;\n    ctx.lineWidth = 1;\n    roundRect(ctx, boxX, boxY, boxW, boxH, BOX_RADIUS);\n    ctx.fill();\n    ctx.stroke();\n\n    // QTY pill — shown at the left of the box for draft and selected/actively-edited pending/entry-order levels when showQuantityField is true\n    let textX = boxX + BOX_PAD_X;\n    const isDraftLevel = (level.data as { _isDraft?: boolean } | undefined)?._isDraft === true;\n    const supportsQtyField = level.type === 'pending' || isEntryOrderPos;\n    const levelLots = (level as PendingOrderLevel | PositionLevel).lots;\n    const showQtyPill = showQuantityField && (isDraftLevel || selected || hasPendingChanges) && supportsQtyField && levelLots !== undefined;\n    if (showQtyPill) {\n        const qtyText = String(levelLots);\n        ctx.font = FONT_MAIN;\n        const pillContentW = ctx.measureText(qtyText).width;\n        const pillW = PILL_PAD_X + pillContentW + PILL_PAD_X;\n        const pillX = textX;\n\n        // Right-side separator line only — blends with the box as a section divider\n        ctx.save();\n        ctx.strokeStyle = monoColor(theme);\n        ctx.globalAlpha = 0.35;\n        ctx.lineWidth = 1;\n        ctx.beginPath();\n        ctx.moveTo(pillX + pillW, boxY + 3);\n        ctx.lineTo(pillX + pillW, boxY + boxH - 3);\n        ctx.stroke();\n        ctx.restore();\n\n        ctx.fillStyle = monoColor(theme);\n        ctx.textAlign = 'left';\n        ctx.textBaseline = 'middle';\n        ctx.fillText(qtyText, pillX + PILL_PAD_X, midY);\n\n        // Hit area uses full box height for easy tapping\n        draftQtyPillAreas?.push({ label: level.label, pillX, pillY: boxY, pillW, pillH: boxH });\n        textX += pillW + PILL_GAP;\n    }\n\n    // PnL text — left side, colored green/red\n    if (pnlText) {\n        const pnlColor =\n            pnl !== undefined ? (pnl >= 0 ? theme.candle.up : theme.candle.down) : monoColor(theme);\n        ctx.font = FONT_PNL;\n        ctx.fillStyle = pnlColor;\n        ctx.textAlign = 'left';\n        ctx.textBaseline = 'middle';\n        ctx.fillText(pnlText, textX, midY);\n        textX += ctx.measureText(pnlText).width + PNL_GAP;\n    }\n\n    // Label text\n    const displayText = getLevelDisplayText(level, layout.price, precision, showQtyPill);\n    ctx.font = FONT_MAIN;\n    ctx.fillStyle = monoColor(theme);\n    ctx.textAlign = 'left';\n    ctx.textBaseline = 'middle';\n    ctx.fillText(displayText, textX, midY);\n\n    const btnY = midY;\n    const d = 3.5;\n\n    if (!hideConfirmCancel && hasPendingChanges) {\n        // ✓ confirm + ✗ cancel only — no × close to avoid confusion\n        const cancelX = boxX + boxW - BOX_PAD_X / 2 - confirmR;\n        const confirmX = cancelX - confirmR - confirmGap - confirmR;\n\n        // ✓ confirm button — green\n        ctx.fillStyle = theme.candle.up;\n        ctx.beginPath();\n        ctx.arc(confirmX, btnY, confirmR, 0, Math.PI * 2);\n        ctx.fill();\n\n        ctx.strokeStyle = theme.background;\n        ctx.lineWidth = 1.5;\n        ctx.lineCap = 'round';\n        ctx.lineJoin = 'round';\n        const ck = 3.1;\n        ctx.beginPath();\n        ctx.moveTo(confirmX - ck, btnY);\n        ctx.lineTo(confirmX - ck * 0.2, btnY + ck * 0.8);\n        ctx.lineTo(confirmX + ck, btnY - ck * 0.7);\n        ctx.stroke();\n\n        // ✗ cancel button — red/down color\n        ctx.fillStyle = theme.candle.down;\n        ctx.beginPath();\n        ctx.arc(cancelX, btnY, confirmR, 0, Math.PI * 2);\n        ctx.fill();\n\n        ctx.strokeStyle = theme.background;\n        ctx.lineWidth = 1.5;\n        ctx.lineCap = 'round';\n        ctx.beginPath();\n        ctx.moveTo(cancelX - d, btnY - d);\n        ctx.lineTo(cancelX + d, btnY + d);\n        ctx.moveTo(cancelX + d, btnY - d);\n        ctx.lineTo(cancelX - d, btnY + d);\n        ctx.stroke();\n\n        confirmAreas.push({\n            label: level.label,\n            type: level.type,\n            data: level.data,\n            action: 'confirm',\n            x: confirmX - confirmR,\n            y: btnY - confirmR,\n            w: confirmR * 2,\n            h: confirmR * 2,\n        });\n        confirmAreas.push({\n            label: level.label,\n            type: level.type,\n            data: level.data,\n            action: 'cancel',\n            x: cancelX - confirmR,\n            y: btnY - confirmR,\n            w: confirmR * 2,\n            h: confirmR * 2,\n        });\n    } else if (!hideConfirmCancel) {\n        // × close button — rightmost in box\n        const closeX = boxX + boxW - BOX_PAD_X / 2 - closeR;\n        // edit/pencil button — left of × button\n        const editX = closeX - closeR - editGap - editR;\n\n        // ✎ edit button\n        ctx.fillStyle = monoColor(theme);\n        ctx.beginPath();\n        ctx.arc(editX, btnY, editR, 0, Math.PI * 2);\n        ctx.fill();\n\n        // Pencil icon inside edit circle\n        const ep = editR * 0.48;\n        ctx.save();\n        ctx.strokeStyle = theme.background;\n        ctx.lineWidth = 1.5;\n        ctx.lineCap = 'round';\n        ctx.lineJoin = 'round';\n        ctx.translate(editX, btnY);\n        ctx.rotate(Math.PI / 4);\n        // Pencil shaft (rectangle outline)\n        ctx.beginPath();\n        ctx.moveTo(-ep * 0.35, -ep);\n        ctx.lineTo(-ep * 0.35, ep * 0.5);\n        ctx.lineTo(ep * 0.35, ep * 0.5);\n        ctx.lineTo(ep * 0.35, -ep);\n        ctx.closePath();\n        ctx.stroke();\n        // Pencil tip (triangle)\n        ctx.beginPath();\n        ctx.moveTo(-ep * 0.35, ep * 0.5);\n        ctx.lineTo(0, ep + ep * 0.45);\n        ctx.lineTo(ep * 0.35, ep * 0.5);\n        ctx.stroke();\n        ctx.restore();\n\n        // × close button\n        ctx.fillStyle = monoColor(theme);\n        ctx.beginPath();\n        ctx.arc(closeX, btnY, closeR, 0, Math.PI * 2);\n        ctx.fill();\n\n        ctx.strokeStyle = theme.background;\n        ctx.lineWidth = 1.5;\n        ctx.lineCap = 'round';\n        ctx.beginPath();\n        ctx.moveTo(closeX - d, btnY - d);\n        ctx.lineTo(closeX + d, btnY + d);\n        ctx.moveTo(closeX + d, btnY - d);\n        ctx.lineTo(closeX - d, btnY + d);\n        ctx.stroke();\n\n        editAreas.push({\n            label: level.label,\n            type: level.type,\n            data: level.data,\n            x: editX - editR,\n            y: btnY - editR,\n            w: editR * 2,\n            h: editR * 2,\n        });\n        hitAreas.push({\n            label: level.label,\n            type: level.type,\n            data: level.data,\n            x: closeX - closeR,\n            y: btnY - closeR,\n            w: closeR * 2,\n            h: closeR * 2,\n        });\n    }\n\n    ctx.restore();\n\n    // ── Drag handle (grip) ─────────────────────────────────────────────────────\n    if (draggable) {\n        drawGripHandle(ctx, gripX, boxY, boxH, colors, hovered);\n\n        // Expand drag area to grip + box body, excluding the button zone on the right.\n        // Button zone is always 36px: edit(14) + gap(4) + close(14) + right-pad(4).\n        // On mobile (hideConfirmCancel) buttons are never drawn, so include the full box width.\n        const BTN_ZONE_W = hideConfirmCancel ? 0 : editR * 2 + editGap + closeR * 2 + BOX_PAD_X / 2;\n        dragAreas.push({\n            label: level.label,\n            type: level.type,\n            data: level.data,\n            price: level.price,\n            x: gripX,\n            y: boxY,\n            w: GRIP_W + 2 + boxW - BTN_ZONE_W,\n            h: boxH,\n            isBracket: false,\n            isBox: true,\n        });\n        // Also make the full horizontal line draggable (buttons are checked first so they still work).\n        dragAreas.push({\n            label: level.label,\n            type: level.type,\n            data: level.data,\n            price: level.price,\n            x: 0,\n            y: y - 4,\n            w: chartW,\n            h: 8,\n            isBracket: false,\n        });\n    } else if (hideConfirmCancel && boxW > 0) {\n        // Mobile: non-draggable levels (e.g. positions) have no grip, but the full box\n        // should still be a touch target so the touch handler can emit tradeLevelEditOpen.\n        dragAreas.push({\n            label: level.label,\n            type: level.type,\n            data: level.data,\n            price: level.price,\n            x: boxX,\n            y: boxY,\n            w: boxW,\n            h: boxH,\n            isBracket: false,\n            isBox: true,\n        });\n    }\n\n    hoverAreas.push({\n        label: level.label,\n        boxX,\n        boxY,\n        boxW,\n        boxH,\n        lineX: 0,\n        lineY: y - 4,\n        lineW: chartW,\n        lineH: 8,\n    });\n}\n\nfunction drawAddBracketButton(\n    ctx: CanvasRenderingContext2D,\n    level: AnyLevel & { side?: 'buy' | 'sell' },\n    bracketType: 'stopLoss' | 'takeProfit',\n    entryY: number,\n    bracketLineX: number,\n    chartW: number,\n    priceH: number,\n    theme: ChartTheme,\n    addBracketAreas: TradeAddBracketArea[]\n): void {\n    // For a buy: SL is below entry (positive Y offset), TP is above (negative Y offset). Sell is reversed.\n    const belowEntry =\n        (level.side === 'buy' && bracketType === 'stopLoss') ||\n        (level.side === 'sell' && bracketType === 'takeProfit');\n    const btnY = entryY + (belowEntry ? ADD_BRACKET_BTN_OFFSET_PX : -ADD_BRACKET_BTN_OFFSET_PX);\n    if (btnY < 0 || btnY > priceH) return;\n\n    // Faint dashed preview line\n    ctx.save();\n    ctx.strokeStyle = monoColor(theme);\n    ctx.lineWidth = 0.8;\n    ctx.globalAlpha = 0.3;\n    ctx.setLineDash([4, 4]);\n    ctx.beginPath();\n    ctx.moveTo(bracketLineX, btnY);\n    ctx.lineTo(chartW, btnY);\n    ctx.stroke();\n    ctx.setLineDash([]);\n    ctx.globalAlpha = 1;\n    ctx.restore();\n\n    // Pill box: \"+SL\" / \"+TP\"\n    const typeLabel = bracketType === 'stopLoss' ? '+SL' : '+TP';\n    ctx.font = FONT_BRACKET;\n    const textW = ctx.measureText(typeLabel).width;\n    const bW = BRACKET_BOX_PAD_X + textW + BRACKET_BOX_PAD_X;\n    const bH = BRACKET_BOX_H;\n    const bX = bracketLineX - bW - 2;\n    const bY = btnY - bH / 2;\n\n    ctx.save();\n    ctx.globalAlpha = 0.75;\n    ctx.fillStyle = monoBoxBg(theme, false);\n    ctx.strokeStyle = monoColor(theme);\n    ctx.lineWidth = 0.8;\n    roundRect(ctx, bX, bY, bW, bH, BOX_RADIUS);\n    ctx.fill();\n    ctx.stroke();\n    ctx.globalAlpha = 1;\n    ctx.fillStyle = monoColor(theme);\n    ctx.textAlign = 'left';\n    ctx.textBaseline = 'middle';\n    ctx.fillText(typeLabel, bX + BRACKET_BOX_PAD_X, btnY);\n    ctx.restore();\n\n    addBracketAreas.push({\n        label: level.label,\n        type: level.type,\n        data: level.data,\n        bracketType,\n        x: bX,\n        y: bY,\n        w: bW,\n        h: bH,\n    });\n}\n\nfunction drawBracketLine(\n    ctx: CanvasRenderingContext2D,\n    level: PendingOrderLevel | (AnyLevel & { side?: 'buy' | 'sell' }),\n    bracketType: 'stopLoss' | 'takeProfit',\n    bracketPrice: number,\n    scale: ScaleManager,\n    priceRange: PriceRange,\n    priceH: number,\n    bracketLineX: number,\n    chartW: number,\n    theme: ChartTheme,\n    precision: number,\n    draggingLabel: string | null,\n    dragNewPrice: number | null,\n    hitAreas: TradeLevelHitArea[],\n    dragAreas: AnyDragArea[],\n    hideConfirmCancel: boolean,\n    bracketOrderLabel?: string,\n    pnlText?: string,\n    /** Scaled × close-button radius (pre-clamped). Pass `1` for default sizing. */\n    buttonScale: number = 1,\n    /**\n     * Displaced top-Y of the info box, computed in Phase 3b when the pill\n     * would otherwise overlap the entry pill. When provided and visibly\n     * different from the natural `y - bH/2`, a dashed vertical leader line\n     * is drawn from the displaced pill center back to the real line `y`.\n     */\n    boxYOverride?: number,\n): void {\n    const closeR = CLOSE_R * Math.min(Math.max(buttonScale, 1), 3);\n    const isDraggingThis = draggingLabel === `${level.label}:${bracketType}`;\n    const price = isDraggingThis && dragNewPrice !== null ? dragNewPrice : bracketPrice;\n\n    const y = scale.yToPixel(price, priceRange, priceH);\n    if (y < -20 || y > priceH + 20) return;\n\n    // ── Solid horizontal line ─────────────────────────────────────────────────\n    ctx.save();\n    ctx.strokeStyle = monoColor(theme);\n    ctx.lineWidth = BRACKET_LINE_W;\n    ctx.globalAlpha = 0.8;\n    ctx.beginPath();\n    ctx.moveTo(bracketLineX, y);\n    ctx.lineTo(chartW, y);\n    ctx.stroke();\n    ctx.globalAlpha = 1;\n\n    // ── Info box (label + × button) at LEFT end of bracket line ──────────────\n    // Natural position is centered on `y`; when displaced to clear the entry\n    // pill, `boxYOverride` carries the cascade-adjusted top-Y and a dashed\n    // leader is drawn back to `y`.\n    const typeLabel = bracketType === 'stopLoss' ? 'SL' : 'TP';\n    const priceStr = price.toFixed(precision);\n    const boxLabel = `${typeLabel} ${priceStr}`;\n\n    ctx.font = FONT_BRACKET;\n    const textW = ctx.measureText(boxLabel).width;\n    const pnlW = pnlText ? ctx.measureText(pnlText).width + BRACKET_BOX_PAD_X : 0;\n    const closeSlot = hideConfirmCancel ? 0 : closeR * 2 + BRACKET_BOX_PAD_X / 2;\n    const bW = BRACKET_BOX_PAD_X + textW + pnlW + BRACKET_BOX_PAD_X + closeSlot;\n    const bH = hideConfirmCancel ? BRACKET_BOX_H : Math.max(BRACKET_BOX_H, closeR * 2 + BRACKET_BOX_PAD_Y * 2);\n    const bX = bracketLineX - bW - 2;\n    const naturalBoxY = y - bH / 2;\n    const bY = boxYOverride ?? naturalBoxY;\n    const boxCenterY = bY + bH / 2;\n    const displaced = Math.abs(bY - naturalBoxY) >= 2;\n\n    // Dashed leader from displaced pill back to real line y\n    if (displaced) {\n        drawBracketLeader(ctx, bX + bW / 2, boxCenterY, y, theme);\n    }\n\n    ctx.fillStyle = monoBoxBg(theme, false);\n    ctx.strokeStyle = monoColor(theme);\n    ctx.lineWidth = 0.8;\n    roundRect(ctx, bX, bY, bW, bH, BOX_RADIUS);\n    ctx.fill();\n    ctx.stroke();\n\n    ctx.fillStyle = monoColor(theme);\n    ctx.textAlign = 'left';\n    ctx.textBaseline = 'middle';\n    ctx.fillText(boxLabel, bX + BRACKET_BOX_PAD_X, boxCenterY);\n\n    // Estimated PNL text — colored green/red, shown after the price label\n    if (pnlText) {\n        const isLoss = pnlText.trim().startsWith('-');\n        ctx.fillStyle = isLoss ? theme.candle.down : theme.candle.up;\n        ctx.fillText(pnlText, bX + BRACKET_BOX_PAD_X + textW + BRACKET_BOX_PAD_X, boxCenterY);\n    }\n\n    if (!hideConfirmCancel) {\n        // × close button\n        const btnX = bX + bW - BRACKET_BOX_PAD_X / 2 - closeR;\n        const btnY = boxCenterY;\n\n        ctx.fillStyle = monoColor(theme);\n        ctx.beginPath();\n        ctx.arc(btnX, btnY, closeR, 0, Math.PI * 2);\n        ctx.fill();\n\n        ctx.strokeStyle = theme.background;\n        ctx.lineWidth = 1.5;\n        ctx.lineCap = 'round';\n        const brd = 3.5;\n        ctx.beginPath();\n        ctx.moveTo(btnX - brd, btnY - brd);\n        ctx.lineTo(btnX + brd, btnY + brd);\n        ctx.moveTo(btnX + brd, btnY - brd);\n        ctx.lineTo(btnX - brd, btnY + brd);\n        ctx.stroke();\n\n        hitAreas.push({\n            label: level.label,\n            type: level.type,\n            data: level.data,\n            bracketType,\n            bracketOrderLabel,\n            x: btnX - closeR,\n            y: btnY - closeR,\n            w: closeR * 2,\n            h: closeR * 2,\n        });\n    }\n\n    ctx.restore();\n\n    // Line drag area — stays anchored at the real price y so grabbing the\n    // horizontal bracket line still drags the bracket even when the pill is\n    // displaced.\n    dragAreas.push({\n        label: level.label,\n        data: level.data,\n        bracketType,\n        price,\n        parentPrice: level.price,\n        parentSide: (level as PendingOrderLevel).side ?? 'buy',\n        bracketOrderLabel,\n        x: bracketLineX,\n        y: y - 5,\n        w: chartW - bracketLineX,\n        h: 10,\n        isBracket: true,\n    });\n    // Box drag area follows the displaced pill (× button is checked first so\n    // close still works).\n    const closeBtnZoneW = closeR * 2 + BRACKET_BOX_PAD_X / 2;\n    dragAreas.push({\n        label: level.label,\n        data: level.data,\n        bracketType,\n        price,\n        parentPrice: level.price,\n        parentSide: (level as PendingOrderLevel).side ?? 'buy',\n        bracketOrderLabel,\n        x: bX,\n        y: bY,\n        w: bW - closeBtnZoneW,\n        h: bH,\n        isBracket: true,\n    });\n}\n\n/**\n * Dashed vertical connector from a displaced bracket pill back to its real\n * horizontal line. Mirrors the visual idiom of `drawFanConnector` but anchors\n * at the pill's center X rather than the chart right edge, since the bracket\n * pill sits on the left end of the bracket line.\n */\nfunction drawBracketLeader(\n    ctx: CanvasRenderingContext2D,\n    leaderX: number,\n    pillCenterY: number,\n    realY: number,\n    theme: ChartTheme,\n): void {\n    if (Math.abs(pillCenterY - realY) < 2) return;\n    ctx.save();\n    ctx.strokeStyle = monoColor(theme);\n    ctx.globalAlpha = 0.35;\n    ctx.lineWidth = 1;\n    ctx.setLineDash([2, 3]);\n    ctx.beginPath();\n    ctx.moveTo(leaderX, pillCenterY);\n    ctx.lineTo(leaderX, realY);\n    ctx.stroke();\n    ctx.restore();\n}\n\nfunction drawGripHandle(\n    ctx: CanvasRenderingContext2D,\n    x: number,\n    boxY: number,\n    boxH: number,\n    colors: ChartTheme['tradeLevels'],\n    hovered: boolean\n): void {\n    const dotColor = hovered ? colors.dragHandleHover : colors.dragHandle;\n    const cols = 2;\n    const rows = 3;\n    const totalW = cols * (GRIP_DOT_R * 2) + (cols - 1) * 3;\n    const totalH = rows * (GRIP_DOT_R * 2) + (rows - 1) * 3;\n    const startX = x + (GRIP_W - totalW) / 2 + GRIP_DOT_R;\n    const startY = boxY + (boxH - totalH) / 2 + GRIP_DOT_R;\n\n    ctx.save();\n    ctx.fillStyle = dotColor;\n    for (let r = 0; r < rows; r++) {\n        for (let c = 0; c < cols; c++) {\n            const dx = startX + c * (GRIP_DOT_R * 2 + 3);\n            const dy = startY + r * (GRIP_DOT_R * 2 + 3);\n            ctx.beginPath();\n            ctx.arc(dx, dy, GRIP_DOT_R, 0, Math.PI * 2);\n            ctx.fill();\n        }\n    }\n    ctx.restore();\n}\n\n/** Portable roundRect helper. */\nfunction roundRect(\n    ctx: CanvasRenderingContext2D,\n    x: number,\n    y: number,\n    w: number,\n    h: number,\n    r: number\n): void {\n    ctx.beginPath();\n    ctx.moveTo(x + r, y);\n    ctx.lineTo(x + w - r, y);\n    ctx.arcTo(x + w, y, x + w, y + r, r);\n    ctx.lineTo(x + w, y + h - r);\n    ctx.arcTo(x + w, y + h, x + w - r, y + h, r);\n    ctx.lineTo(x + r, y + h);\n    ctx.arcTo(x, y + h, x, y + h - r, r);\n    ctx.lineTo(x, y + r);\n    ctx.arcTo(x, y, x + r, y, r);\n    ctx.closePath();\n}\n\n/**\n * Returns the hit area whose × button contains the given canvas coordinate,\n * or `null` if none match.\n */\nexport function hitTestTradeLevelClose(\n    x: number,\n    y: number,\n    hitAreas: TradeLevelHitArea[]\n): TradeLevelHitArea | null {\n    return hitAreas.find((h) => x >= h.x && x <= h.x + h.w && y >= h.y && y <= h.y + h.h) ?? null;\n}\n\n/**\n * Returns the edit area whose pencil button contains the given canvas coordinate,\n * or `null` if none match.\n */\nexport function hitTestTradeLevelEdit(\n    x: number,\n    y: number,\n    editAreas: TradeLevelHitArea[]\n): TradeLevelHitArea | null {\n    return editAreas.find((h) => x >= h.x && x <= h.x + h.w && y >= h.y && y <= h.y + h.h) ?? null;\n}\n\n/**\n * Returns the confirm/cancel area that contains the given coordinate, or `null`.\n */\nexport function hitTestTradeLevelConfirm(\n    x: number,\n    y: number,\n    confirmAreas: TradeLevelConfirmArea[]\n): TradeLevelConfirmArea | null {\n    return (\n        confirmAreas.find((a) => x >= a.x && x <= a.x + a.w && y >= a.y && y <= a.y + a.h) ?? null\n    );\n}\n\n/**\n * Returns the hover area whose box or line strip contains the given coordinate,\n * or `null` if none match.\n */\nexport function hitTestTradeLevelHover(\n    x: number,\n    y: number,\n    hoverAreas: TradeHoverArea[]\n): TradeHoverArea | null {\n    return (\n        hoverAreas.find(\n            (h) =>\n                (x >= h.boxX && x <= h.boxX + h.boxW && y >= h.boxY && y <= h.boxY + h.boxH) ||\n                (x >= h.lineX && x <= h.lineX + h.lineW && y >= h.lineY && y <= h.lineY + h.lineH)\n        ) ?? null\n    );\n}\n\n/**\n * Returns the drag area (grip handle or bracket line strip) that contains the\n * given coordinate, or `null` if none match.\n */\nexport function hitTestTradeLevelDrag(\n    x: number,\n    y: number,\n    dragAreas: AnyDragArea[]\n): AnyDragArea | null {\n    return dragAreas.find((d) => x >= d.x && x <= d.x + d.w && y >= d.y && y <= d.y + d.h) ?? null;\n}\n\n/**\n * Returns the +SL / +TP add-bracket button area that contains the given\n * coordinate, or `null` if none match.\n */\nexport function hitTestTradeLevelAddBracket(\n    x: number,\n    y: number,\n    areas: TradeAddBracketArea[]\n): TradeAddBracketArea | null {\n    return areas.find((a) => x >= a.x && x <= a.x + a.w && y >= a.y && y <= a.y + a.h) ?? null;\n}\n\n/**\n * Renders small colored price tags on the right-side price axis strip for each\n * true open position (excludes ES/EL entry working orders). Visual language\n * matches the existing Bid/Ask price tag — filled rectangle with white text.\n */\nexport function renderPositionAxisTags(\n    ctx: CanvasRenderingContext2D,\n    levels: AnyLevel[],\n    scale: ScaleManager,\n    priceRange: PriceRange,\n    theme: ChartTheme,\n    chartW: number,\n    priceH: number,\n    precision: number\n): void {\n    const tagH = 16;\n\n    const items: Array<{ y: number; label: string; color: string }> = [];\n    for (const level of levels) {\n        if (level.type !== 'position') continue;\n        const pos = level as PositionLevel;\n        if (pos.entryPriceEditable) continue;\n        const y = scale.yToPixel(pos.price, priceRange, priceH);\n        if (y < -tagH || y > priceH + tagH) continue;\n        items.push({\n            y,\n            label: pos.price.toFixed(precision),\n            color: levelColor(level, theme.tradeLevels, theme),\n        });\n    }\n    if (items.length === 0) return;\n\n    items.sort((a, b) => a.y - b.y);\n\n    // Vertical de-dup: push overlapping tags down\n    let lastBottom = -Infinity;\n    for (const it of items) {\n        if (it.y - tagH / 2 < lastBottom) {\n            it.y = lastBottom + tagH / 2;\n        }\n        lastBottom = it.y + tagH / 2 + 1;\n    }\n\n    ctx.save();\n    ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n    ctx.textAlign = 'left';\n    ctx.textBaseline = 'middle';\n    for (const it of items) {\n        const tw = ctx.measureText(it.label).width;\n        ctx.fillStyle = it.color;\n        ctx.fillRect(chartW, it.y - tagH / 2, tw + 12, tagH);\n        ctx.fillStyle = '#ffffff';\n        ctx.fillText(it.label, chartW + 4, it.y);\n    }\n    ctx.restore();\n}\n\n/**\n * Renders a floating price label pill on the right side of the chart,\n * used during a drag to show the live price under the cursor.\n */\nexport function renderDragPriceLabel(\n    ctx: CanvasRenderingContext2D,\n    price: number,\n    y: number,\n    theme: ChartTheme,\n    chartW: number,\n    precision: number\n): void {\n    const label = price.toFixed(precision);\n    ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n    const tw = ctx.measureText(label).width;\n    const pad = 6;\n    const bw = tw + pad * 2;\n    const bh = 16;\n    const bx = chartW - bw - 2;\n    const by = y - bh / 2;\n\n    ctx.save();\n    ctx.fillStyle = theme.ui.accent;\n    ctx.strokeStyle = theme.ui.accent;\n    roundRect(ctx, bx, by, bw, bh, 3);\n    ctx.fill();\n\n    ctx.fillStyle = '#ffffff';\n    ctx.textAlign = 'left';\n    ctx.textBaseline = 'middle';\n    ctx.fillText(label, bx + pad, y);\n    ctx.restore();\n}\n","import type { AnyLevel, PendingOrderLevel, PositionLevel, PriceRange } from '../core/types.js';\nimport type { ChartTheme } from '../core/themes.js';\n\nexport type OffViewportDirection = 'up' | 'down';\nexport type OffViewportMarkerKind = 'entry' | 'sl' | 'tp';\n\n/** Click hit area for an off-viewport indicator pill. */\nexport interface OffViewportHitArea {\n    direction: OffViewportDirection;\n    x: number;\n    y: number;\n    w: number;\n    h: number;\n    /** Price to smooth-scroll into the vertical center when clicked. */\n    targetPrice: number;\n    /** Label of the level the target marker belongs to. */\n    targetLabel: string;\n    /** Which component of the level is the target (entry line vs SL/TP bracket). */\n    targetKind: OffViewportMarkerKind;\n}\n\ninterface Marker {\n    price: number;\n    label: string;\n    kind: OffViewportMarkerKind;\n}\n\n/**\n * Collects trade-level price markers that lie outside `priceRange`, partitioned\n * by direction. Each of entry/SL/TP is its own marker so an in-view entry with\n * an off-view SL is still surfaced.\n *\n * Exported for unit testing — pure, no canvas deps.\n */\nexport function collectOffViewportMarkers(\n    levels: AnyLevel[],\n    priceRange: PriceRange,\n    draggingLabel: string | null,\n): { above: Marker[]; below: Marker[] } {\n    const above: Marker[] = [];\n    const below: Marker[] = [];\n    const { min, max } = priceRange;\n\n    for (const level of levels) {\n        if (level.label === draggingLabel) continue;\n\n        const isDraftMarket =\n            level.type === 'pending' &&\n            (level as PendingOrderLevel).orderType === 'market' &&\n            (level.data as { _isDraft?: boolean } | undefined)?._isDraft === true;\n        if (isDraftMarket) continue;\n\n        if (isFinite(level.price)) {\n            if (level.price > max) above.push({ price: level.price, label: level.label, kind: 'entry' });\n            else if (level.price < min) below.push({ price: level.price, label: level.label, kind: 'entry' });\n        }\n\n        const slPrice = (level as PositionLevel).stopLossPrice;\n        const tpPrice = (level as PositionLevel).takeProfitPrice;\n\n        if (slPrice !== undefined && isFinite(slPrice)) {\n            if (slPrice > max) above.push({ price: slPrice, label: level.label, kind: 'sl' });\n            else if (slPrice < min) below.push({ price: slPrice, label: level.label, kind: 'sl' });\n        }\n        if (tpPrice !== undefined && isFinite(tpPrice)) {\n            if (tpPrice > max) above.push({ price: tpPrice, label: level.label, kind: 'tp' });\n            else if (tpPrice < min) below.push({ price: tpPrice, label: level.label, kind: 'tp' });\n        }\n    }\n\n    return { above, below };\n}\n\n/** Count of entry-only markers (SL/TP legs are excluded from the displayed count). */\nfunction entryCount(markers: Marker[]): number {\n    let n = 0;\n    for (const m of markers) if (m.kind === 'entry') n++;\n    return n;\n}\n\n/** Marker whose price is closest to `edge` — the first to return into view on scroll. */\nfunction nearestEdgeMarker(markers: Marker[], edge: number): Marker {\n    let best = markers[0]!;\n    let bestDist = Math.abs(best.price - edge);\n    for (let i = 1; i < markers.length; i++) {\n        const d = Math.abs(markers[i]!.price - edge);\n        if (d < bestDist) {\n            best = markers[i]!;\n            bestDist = d;\n        }\n    }\n    return best;\n}\n\nconst PILL_FONT = \"11px 'Inter', system-ui, sans-serif\";\nconst PILL_PAD_X = 8;\nconst PILL_RIGHT_MARGIN = 8;\nconst PILL_V_MARGIN = 10;\nconst PILL_H = 20;\nconst PILL_RADIUS = 10;\nconst ARROW_UP = '\\u25B2';\nconst ARROW_DOWN = '\\u25BC';\n\n/**\n * Renders ▲/▼ count pills at the right edge of the chart for off-viewport\n * trade level markers. Returns hit areas for click-to-scroll handling.\n */\nexport function renderOffViewportIndicators(\n    ctx: CanvasRenderingContext2D,\n    levels: AnyLevel[],\n    priceRange: PriceRange,\n    theme: ChartTheme,\n    chartWidth: number,\n    chartHeight: number,\n    draggingLabel: string | null,\n    selectedLabel: string | null = null,\n): { hitAreas: OffViewportHitArea[] } {\n    const hitAreas: OffViewportHitArea[] = [];\n\n    // Expand priceRange to match the visual bounds on screen.\n    // ScaleManager uses VERTICAL_PADDING_PX = 20 on top and bottom, so prices\n    // slightly outside [min, max] are still rendered on canvas. We should only\n    // flag a level as off-viewport when its line is truly off-screen.\n    const PADDING_PX = 20; // must match ScaleManager.VERTICAL_PADDING_PX\n    const usable = chartHeight - 2 * PADDING_PX;\n    const span = priceRange.max - priceRange.min;\n    const padInPrice = usable > 0 ? (span / usable) * PADDING_PX : 0;\n    const visualRange: PriceRange = {\n        min: priceRange.min - padInPrice,\n        max: priceRange.max + padInPrice,\n    };\n\n    const { above, below } = collectOffViewportMarkers(levels, visualRange, draggingLabel);\n    if (above.length === 0 && below.length === 0) return { hitAreas };\n\n    ctx.save();\n    ctx.font = PILL_FONT;\n    ctx.textBaseline = 'middle';\n    ctx.textAlign = 'center';\n\n    const PILL_GAP = 4;\n\n    /** Draw a single pill and register its hit area. Returns the pill width. */\n    const renderPill = (\n        direction: OffViewportDirection,\n        text: string,\n        y: number,\n        target: Marker,\n    ): number => {\n        const textW = ctx.measureText(text).width;\n        const w = Math.ceil(textW) + PILL_PAD_X * 2;\n        const x = chartWidth - PILL_RIGHT_MARGIN - w;\n\n        ctx.fillStyle = theme.tooltip.background;\n        ctx.strokeStyle = theme.tooltip.border;\n        ctx.lineWidth = 1;\n        roundedRect(ctx, x, y, w, PILL_H, PILL_RADIUS);\n        ctx.fill();\n        ctx.stroke();\n\n        ctx.fillStyle = theme.tooltip.text;\n        ctx.fillText(text, x + w / 2, y + PILL_H / 2 + 0.5);\n\n        hitAreas.push({\n            direction,\n            x,\n            y,\n            w,\n            h: PILL_H,\n            targetPrice: target.price,\n            targetLabel: target.label,\n            targetKind: target.kind,\n        });\n        return w;\n    };\n\n    const drawColumn = (direction: OffViewportDirection, markers: Marker[], baseY: number): void => {\n        if (markers.length === 0) return;\n        const arrow = direction === 'up' ? ARROW_UP : ARROW_DOWN;\n        const edge = direction === 'up' ? priceRange.max : priceRange.min;\n        // +1 stacks downward from top, -1 stacks upward from bottom\n        const stackDir = direction === 'up' ? 1 : -1;\n        let nextY = baseY;\n\n        // Entry count pill\n        const entries = entryCount(markers);\n        if (entries > 0) {\n            const target = nearestEdgeMarker(\n                markers.filter((m) => m.kind === 'entry'),\n                edge,\n            );\n            renderPill(direction, `${arrow} ${entries}`, nextY, target);\n            nextY += stackDir * (PILL_H + PILL_GAP);\n        }\n\n        // Separate SL/TP pills — only when a level is selected\n        if (selectedLabel !== null) {\n            const bracketMarkers = markers.filter(\n                (m) => m.kind !== 'entry' && m.label === selectedLabel,\n            );\n            for (const bm of bracketMarkers) {\n                const kindLabel = bm.kind.toUpperCase(); // \"SL\" or \"TP\"\n                renderPill(direction, `${arrow} ${kindLabel}`, nextY, bm);\n                nextY += stackDir * (PILL_H + PILL_GAP);\n            }\n        }\n    };\n\n    drawColumn('up', above, PILL_V_MARGIN);\n    drawColumn('down', below, chartHeight - PILL_V_MARGIN - PILL_H);\n\n    ctx.restore();\n    return { hitAreas };\n}\n\n/** Hit test a point against off-viewport indicator pills. Returns the hit area or null. */\nexport function hitTestOffViewportIndicator(\n    x: number,\n    y: number,\n    hitAreas: OffViewportHitArea[],\n): OffViewportHitArea | null {\n    return hitAreas.find((h) => x >= h.x && x <= h.x + h.w && y >= h.y && y <= h.y + h.h) ?? null;\n}\n\n/**\n * Returns true when a DOM element centred at `centerY` with half-height `halfH`\n * vertically overlaps any off-viewport indicator pill. Used to let the\n * off-viewport pills receive clicks through overlapping DOM trade buttons.\n */\nexport function overlapsOffViewportPill(\n    centerY: number,\n    halfH: number,\n    hitAreas: OffViewportHitArea[],\n): boolean {\n    const top = centerY - halfH;\n    const bottom = centerY + halfH;\n    return hitAreas.some((h) => top < h.y + h.h && bottom > h.y);\n}\n\nfunction roundedRect(\n    ctx: CanvasRenderingContext2D,\n    x: number,\n    y: number,\n    w: number,\n    h: number,\n    r: number,\n): void {\n    const rr = Math.min(r, w / 2, h / 2);\n    ctx.beginPath();\n    ctx.moveTo(x + rr, y);\n    ctx.lineTo(x + w - rr, y);\n    ctx.quadraticCurveTo(x + w, y, x + w, y + rr);\n    ctx.lineTo(x + w, y + h - rr);\n    ctx.quadraticCurveTo(x + w, y + h, x + w - rr, y + h);\n    ctx.lineTo(x + rr, y + h);\n    ctx.quadraticCurveTo(x, y + h, x, y + h - rr);\n    ctx.lineTo(x, y + rr);\n    ctx.quadraticCurveTo(x, y, x + rr, y);\n    ctx.closePath();\n}\n","import type { OHLCVBar, Viewport } from \"../core/types.js\";\nimport type { ScaleManager } from \"../core/ScaleManager.js\";\nimport type { ChartTheme } from \"../core/themes.js\";\nimport { DEFAULT_TIME_AXIS_CONFIG, type TimeAxisUiConfig } from \"../core/uiConfig.js\";\n\nconst COUNTDOWN_LABEL_HEIGHT = 18;\nconst COUNTDOWN_LABEL_PADDING_X = 6;\nconst COUNTDOWN_LABEL_RADIUS = 3;\n\nconst INTRADAY_TIMEFRAMES: string[] = [\"1m\", \"5m\", \"15m\", \"30m\", \"1h\", \"4h\"];\n\nexport function formatRemaining(totalSec: number): string {\n    if (totalSec < 60) return `${totalSec}s`;\n    if (totalSec < 3_600) {\n        const m = Math.floor(totalSec / 60);\n        const s = totalSec % 60;\n        return `${m}:${s.toString().padStart(2, \"0\")}`;\n    }\n    if (totalSec < 86_400) {\n        const h = Math.floor(totalSec / 3_600);\n        const m = Math.floor((totalSec % 3_600) / 60);\n        return `${h}h ${m}m`;\n    }\n    if (totalSec < 604_800) {\n        const d = Math.floor(totalSec / 86_400);\n        const h = Math.floor((totalSec % 86_400) / 3_600);\n        return `${d}d ${h}h`;\n    }\n    const w = Math.floor(totalSec / 604_800);\n    const d = Math.floor((totalSec % 604_800) / 86_400);\n    return `${w}w ${d}d`;\n}\n\nfunction formatTimestamp(ts: number, visibleBars: number, timeframe?: string, spansMultipleDays?: boolean, timezone = \"UTC\"): string {\n    const d = new Date(ts);\n    if (timeframe && INTRADAY_TIMEFRAMES.includes(timeframe)) {\n        const time = d.toLocaleTimeString(\"en-US\", {\n            hour: \"2-digit\",\n            minute: \"2-digit\",\n            hour12: false,\n            timeZone: timezone,\n        });\n        if (spansMultipleDays) {\n            return d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\", timeZone: timezone }) + \" \" + time;\n        }\n        return time;\n    }\n    if (timeframe === \"1Y\") {\n        return d.toLocaleDateString(\"en-US\", { year: \"numeric\", timeZone: timezone });\n    }\n    if (timeframe === \"1M\") {\n        return d.toLocaleDateString(\"en-US\", { month: \"short\", year: \"numeric\", timeZone: timezone });\n    }\n    if (visibleBars <= 365) {\n        return d.toLocaleDateString(\"en-US\", {\n            month: \"short\",\n            day: \"numeric\",\n            timeZone: timezone,\n        });\n    }\n    return d.toLocaleDateString(\"en-US\", { month: \"short\", year: \"2-digit\", timeZone: timezone });\n}\n\nexport function renderTimeAxis(\n    ctx: CanvasRenderingContext2D,\n    bars: OHLCVBar[],\n    viewport: Viewport,\n    scale: ScaleManager,\n    theme: ChartTheme,\n    chartWidth: number,\n    axisY: number,\n    maxLabels = 8,\n    cfg: TimeAxisUiConfig = DEFAULT_TIME_AXIS_CONFIG,\n    timeframe?: string,\n    countdownBarIndex?: number,\n    timezone = \"UTC\",\n): void {\n    if (bars.length === 0) return;\n\n    const visibleBars = viewport.endIndex - viewport.startIndex;\n\n    const firstBar = bars[0];\n    const lastBar = bars[bars.length - 1];\n    const spansMultipleDays =\n        !!firstBar &&\n        !!lastBar &&\n        new Date(firstBar.time).toLocaleDateString(\"en-US\", { timeZone: timezone }) !==\n        new Date(lastBar.time).toLocaleDateString(\"en-US\", { timeZone: timezone });\n\n    ctx.fillStyle = theme.axisText;\n    ctx.font = `${cfg.fontSize} ${cfg.fontFamily}`;\n    ctx.textAlign = \"center\";\n\n    // Determine a step that prevents label overlap.\n    // Start from the count-based step, then widen until adjacent labels have\n    // enough room (measured text width + MIN_GAP px on each side).\n    const MIN_GAP = 12;\n    const sampleBar = bars[Math.floor(bars.length / 2)] ?? bars[0];\n    const sampleLabel = formatTimestamp(sampleBar.time, visibleBars, timeframe, spansMultipleDays, timezone);\n    const labelW = ctx.measureText(sampleLabel).width;\n    const minStep = Math.max(1, Math.floor(bars.length / maxLabels));\n    let step = minStep;\n    if (bars.length > 1) {\n        const pxPerBar = chartWidth / Math.max(1, bars.length);\n        const requiredPx = labelW + MIN_GAP * 2;\n        if (pxPerBar * step < requiredPx) {\n            step = Math.ceil(requiredPx / pxPerBar);\n        }\n    }\n\n    for (let i = 0; i < bars.length; i += step) {\n        const barIndex = viewport.startIndex + i;\n        if (countdownBarIndex !== undefined && barIndex === countdownBarIndex) continue;\n        const x = scale.xToPixel(barIndex, viewport, chartWidth);\n        const label = formatTimestamp(bars[i].time, visibleBars, timeframe, spansMultipleDays, timezone);\n\n        const halfW = ctx.measureText(label).width / 2;\n        const clampedX = Math.max(halfW, Math.min(chartWidth - halfW, x));\n        ctx.fillText(label, clampedX, axisY + 14);\n    }\n}\n\n/**\n * Renders a countdown pill on the time axis showing how much time remains\n * until the current (last) candle closes. Positioned beneath the last bar.\n */\nexport function renderCandleCountdown(\n    ctx: CanvasRenderingContext2D,\n    lastBarTime: number,\n    intervalMs: number,\n    lastBarIndex: number,\n    viewport: Viewport,\n    scale: ScaleManager,\n    theme: ChartTheme,\n    chartWidth: number,\n    axisY: number,\n    cfg: TimeAxisUiConfig = DEFAULT_TIME_AXIS_CONFIG,\n): void {\n    const remaining = Math.max(0, lastBarTime + intervalMs - Date.now());\n    const totalSec = Math.ceil(remaining / 1000);\n    const label = formatRemaining(totalSec);\n\n    ctx.font = `${cfg.fontSize} ${cfg.fontFamily}`;\n    const textW = ctx.measureText(label).width;\n    const boxW = textW + COUNTDOWN_LABEL_PADDING_X * 2;\n    const boxH = COUNTDOWN_LABEL_HEIGHT;\n\n    const x = scale.xToPixel(lastBarIndex, viewport, chartWidth);\n    // Only clamp against the left edge; clip against the right so the pill\n    // stays centred on the last candle even when it is near the right boundary.\n    const cx = Math.max(boxW / 2, x);\n    const boxX = cx - boxW / 2;\n    const boxY = axisY + 1;\n\n    ctx.save();\n    ctx.beginPath();\n    ctx.rect(0, axisY, chartWidth, COUNTDOWN_LABEL_HEIGHT + 4);\n    ctx.clip();\n\n    // Filled rounded-rect background — use axisText (always opaque) so any\n    // time label at this position is fully occluded.\n    ctx.fillStyle = theme.axisText;\n    ctx.beginPath();\n    ctx.roundRect(boxX, boxY, boxW, boxH, COUNTDOWN_LABEL_RADIUS);\n    ctx.fill();\n\n    // Label text\n    ctx.fillStyle = theme.background;\n    ctx.textAlign = \"center\";\n    ctx.textBaseline = \"middle\";\n    ctx.fillText(label, cx, boxY + boxH / 2);\n    ctx.textBaseline = \"alphabetic\";\n\n    ctx.restore();\n}\n\n/**\n * Renders a candle-close countdown box on the right price axis, sitting flush\n * below the live price tag. Width matches the price tag's box exactly so the\n * two boxes stack as an aligned pair regardless of price-string length. Uses\n * neutral colors so it's visually distinct from the directional price tag.\n */\nexport function renderPriceAxisCountdown(\n    ctx: CanvasRenderingContext2D,\n    lastBarTime: number,\n    intervalMs: number,\n    theme: ChartTheme,\n    /** Left edge of the live price tag — countdown shares this X for vertical alignment. */\n    boxX: number,\n    /** Top-left Y of the live price tag (not its center). */\n    priceTagY: number,\n    tagH: number,\n    /** Width of the live price tag — countdown box mirrors this exactly. */\n    boxW: number,\n): void {\n    const remaining = Math.max(0, lastBarTime + intervalMs - Date.now());\n    const totalSec = Math.ceil(remaining / 1000);\n    const label = formatRemaining(totalSec);\n\n    const boxY = priceTagY + tagH;\n\n    ctx.save();\n    ctx.fillStyle = theme.axisText;\n    ctx.fillRect(boxX, boxY, boxW, tagH);\n\n    ctx.fillStyle = theme.background;\n    ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n    ctx.textAlign = \"left\";\n    ctx.fillText(label, boxX + 4, boxY + tagH - 4);\n    ctx.restore();\n}\n","import type { PriceRange } from '../core/types.js';\nimport { type ScaleManager, generatePriceTicks, precisionForStep } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { DEFAULT_PRICE_AXIS_CONFIG, type PriceAxisUiConfig } from '../core/uiConfig.js';\n\nexport function renderPriceAxis(\n  ctx: CanvasRenderingContext2D,\n  priceRange: PriceRange,\n  scale: ScaleManager,\n  theme: ChartTheme,\n  chartWidth: number,\n  chartHeight: number,\n  axisWidth: number,\n  gridLines?: number,\n  pricePrecision = 2,\n  cfg: PriceAxisUiConfig = DEFAULT_PRICE_AXIS_CONFIG,\n): void {\n  ctx.fillStyle = theme.axisText;\n  ctx.font = `${cfg.fontSize} ${cfg.fontFamily}`;\n  ctx.textAlign = 'left';\n\n  // Adaptive path: no explicit gridLines → tick count scales with height +\n  // step snaps to 1/2/5×10^n. Sub-panes that pass a fixed count keep the\n  // old divide-by-N behaviour.\n  if (gridLines === undefined) {\n    const ticks = generatePriceTicks(priceRange, chartHeight);\n    const step = ticks.length >= 2 ? ticks[1] - ticks[0] : (priceRange.max - priceRange.min);\n    const precision = precisionForStep(step, pricePrecision);\n    for (const price of ticks) {\n      const y = scale.yToPixel(price, priceRange, chartHeight);\n      ctx.fillText(price.toFixed(precision), chartWidth + 4, y + 4);\n    }\n    return;\n  }\n\n  const step = (priceRange.max - priceRange.min) / gridLines;\n  for (let i = 0; i <= gridLines; i++) {\n    const price = priceRange.min + step * i;\n    const y = scale.yToPixel(price, priceRange, chartHeight);\n    const label = price.toFixed(pricePrecision);\n    ctx.fillText(label, chartWidth + 4, y + 4);\n  }\n}\n","/**\n * Central SVG icon definitions for FinChart UI.\n *\n * Two patterns:\n *  - Static strings (currentColor)  — for elements whose CSS `color` is reliably\n *    set by the parent (TopBar, LeftBar, IndicatorOverlay, dialogs).\n *  - Color functions `(c: string) => string` — for elements inside ChartEngine\n *    where a full-size canvas sits above them in the stacking context, making\n *    `currentColor` inheritance unreliable. The hex color is baked directly into\n *    the SVG `stroke` attribute.\n *\n * All icons use a 16×16 viewBox. Coordinates are hand-verified against the\n * circle/path geometry so the shapes render correctly at any scale.\n */\n\nimport type { SeriesType } from '../core/types.js';\n\n// ── Internal helper ───────────────────────────────────────────────────────────\n\nfunction mkSvg(body: string, size: number): string {\n    return `<svg viewBox=\"0 0 16 16\" width=\"${size}\" height=\"${size}\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">${body}</svg>`;\n}\n\n// ── Static icons (currentColor) ──────────────────────────────────────────────\n\n/** Gear / settings icon — cog with 8 teeth and centre bore. */\nexport const ICON_SETTINGS =\n    `<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n    `<path d=\"M6.5 1.5h3l.5 1.8a5.1 5.1 0 0 1 1.24.72l1.76-.56 1.5 2.6-1.38 1.18a5.2 5.2 0 0 1 0 1.44l1.38 1.18-1.5 2.6-1.76-.56A5.1 5.1 0 0 1 10 12.7l-.5 1.8h-3l-.5-1.8a5.1 5.1 0 0 1-1.24-.72l-1.76.56-1.5-2.6L2.88 8.76a5.2 5.2 0 0 1 0-1.44L1.5 6.14l1.5-2.6 1.76.56A5.1 5.1 0 0 1 6 3.38Z\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linejoin=\"round\"/>` +\n    `<circle cx=\"8\" cy=\"8\" r=\"2.2\" stroke=\"currentColor\" stroke-width=\"1.3\"/>` +\n    `</svg>`;\n\n/** Alias — same icon, used where variable is called \"gear\". */\nexport const ICON_GEAR = ICON_SETTINGS;\n\n/** Pencil / drawing tools toggle icon. */\nexport const ICON_PENCIL =\n    `<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n    `<path d=\"M11.5 2.5a1.5 1.5 0 0 1 2.121 2.121l-8.5 8.5L2.5 13.5l.379-2.621 8.621-8.379Z\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n    `</svg>`;\n\n/** Close / remove × icon. */\nexport const ICON_CLOSE =\n    `<svg viewBox=\"0 0 16 16\" width=\"10\" height=\"10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n    `<path d=\"M3 3l10 10M13 3L3 13\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>` +\n    `</svg>`;\n\n/** Fullscreen enter (arrows pointing outward). */\nexport const ICON_FULLSCREEN_ENTER =\n    `<svg viewBox=\"0 0 16 16\" width=\"15\" height=\"15\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n    `<path d=\"M1.5 6.5V1.5h5M6.5 6.5L1.5 1.5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n    `<path d=\"M14.5 9.5v5h-5M9.5 9.5l5 5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n    `</svg>`;\n\n/** Fullscreen exit (arrows pointing inward). */\nexport const ICON_FULLSCREEN_EXIT =\n    `<svg viewBox=\"0 0 16 16\" width=\"15\" height=\"15\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n    `<path d=\"M6.5 1.5H1.5v5M1.5 1.5l5 5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n    `<path d=\"M9.5 14.5H14.5v-5M14.5 14.5l-5-5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n    `</svg>`;\n\n/** Trash / delete icon (bin body + lid). */\nexport const ICON_TRASH =\n    `<svg viewBox=\"0 0 16 16\" width=\"15\" height=\"15\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n    `<polyline points=\"3.5,5 4.5,13.5 11.5,13.5 12.5,5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n    `<line x1=\"2\" y1=\"5\" x2=\"14\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>` +\n    `<path d=\"M6 5V3.5C6 3 6.5 2.5 7 2.5h2C9.5 2.5 10 3 10 3.5V5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>` +\n    `</svg>`;\n\n/** Chart-type icons for the series picker dropdown. */\nexport const ICON_SERIES: Record<SeriesType, string> = {\n    candlestick: `<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <line x1=\"3\" y1=\"1.5\" x2=\"3\" y2=\"3.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n        <rect x=\"1.5\" y=\"3.5\" width=\"3\" height=\"5\" fill=\"currentColor\" rx=\"0.5\"/>\n        <line x1=\"3\" y1=\"8.5\" x2=\"3\" y2=\"11\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n        <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.6\"/>\n        <rect x=\"6.5\" y=\"4\" width=\"3\" height=\"7\" fill=\"currentColor\" rx=\"0.5\" opacity=\"0.5\"/>\n        <line x1=\"8\" y1=\"11\" x2=\"8\" y2=\"13.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.6\"/>\n        <line x1=\"13\" y1=\"3.5\" x2=\"13\" y2=\"5.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n        <rect x=\"11.5\" y=\"5.5\" width=\"3\" height=\"4.5\" fill=\"currentColor\" rx=\"0.5\"/>\n        <line x1=\"13\" y1=\"10\" x2=\"13\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n    </svg>`,\n\n    hollow: `<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <line x1=\"3\" y1=\"1.5\" x2=\"3\" y2=\"3.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n        <rect x=\"1.5\" y=\"3.5\" width=\"3\" height=\"5\" fill=\"currentColor\" rx=\"0.5\"/>\n        <line x1=\"3\" y1=\"8.5\" x2=\"3\" y2=\"11\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n        <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.6\"/>\n        <rect x=\"6.5\" y=\"4\" width=\"3\" height=\"7\" stroke=\"currentColor\" stroke-width=\"1.2\" rx=\"0.5\" opacity=\"0.7\"/>\n        <line x1=\"8\" y1=\"11\" x2=\"8\" y2=\"13.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.6\"/>\n        <line x1=\"13\" y1=\"3.5\" x2=\"13\" y2=\"5.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n        <rect x=\"11.5\" y=\"5.5\" width=\"3\" height=\"4.5\" fill=\"currentColor\" rx=\"0.5\"/>\n        <line x1=\"13\" y1=\"10\" x2=\"13\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n    </svg>`,\n\n    ohlc: `<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <line x1=\"3\" y1=\"2\" x2=\"3\" y2=\"11.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n        <line x1=\"1.5\" y1=\"4.5\" x2=\"3\" y2=\"4.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n        <line x1=\"3\" y1=\"8.5\" x2=\"4.5\" y2=\"8.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n        <line x1=\"8\" y1=\"3\" x2=\"8\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" opacity=\"0.6\"/>\n        <line x1=\"6.5\" y1=\"6\" x2=\"8\" y2=\"6\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" opacity=\"0.6\"/>\n        <line x1=\"8\" y1=\"10.5\" x2=\"9.5\" y2=\"10.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" opacity=\"0.6\"/>\n        <line x1=\"13\" y1=\"4.5\" x2=\"13\" y2=\"12.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n        <line x1=\"11.5\" y1=\"7\" x2=\"13\" y2=\"7\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n        <line x1=\"13\" y1=\"10\" x2=\"14.5\" y2=\"10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n    </svg>`,\n\n    line: `<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <polyline points=\"1,13 4,8 7,10 10,4 13,6 15,3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\" stroke-linecap=\"round\"/>\n    </svg>`,\n\n    area: `<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M1,13 L4,8 L7,10 L10,4 L13,6 L15,3 L15,14 L1,14 Z\" fill=\"currentColor\" opacity=\"0.25\"/>\n        <polyline points=\"1,13 4,8 7,10 10,4 13,6 15,3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\" stroke-linecap=\"round\"/>\n    </svg>`,\n\n    heikinashi: `<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <line x1=\"3\" y1=\"2\" x2=\"3\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n        <rect x=\"1.5\" y=\"4\" width=\"3\" height=\"5\" fill=\"currentColor\" rx=\"0.5\"/>\n        <line x1=\"3\" y1=\"9\" x2=\"3\" y2=\"11.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n        <line x1=\"8.5\" y1=\"1.5\" x2=\"8.5\" y2=\"3.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.5\"/>\n        <rect x=\"7\" y=\"3.5\" width=\"3\" height=\"6.5\" fill=\"currentColor\" rx=\"0.5\" opacity=\"0.45\"/>\n        <line x1=\"8.5\" y1=\"10\" x2=\"8.5\" y2=\"12.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.5\"/>\n        <line x1=\"13.5\" y1=\"3\" x2=\"13.5\" y2=\"5.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n        <rect x=\"12\" y=\"5.5\" width=\"3\" height=\"4\" fill=\"currentColor\" rx=\"0.5\"/>\n        <line x1=\"13.5\" y1=\"9.5\" x2=\"13.5\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n    </svg>`,\n\n    volumecandles: `<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <line x1=\"3\" y1=\"1.5\" x2=\"3\" y2=\"3.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n        <rect x=\"1.5\" y=\"3.5\" width=\"3\" height=\"5\" fill=\"currentColor\" rx=\"0.5\"/>\n        <line x1=\"3\" y1=\"8.5\" x2=\"3\" y2=\"11\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n        <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.6\"/>\n        <rect x=\"5.5\" y=\"4\" width=\"5\" height=\"7\" fill=\"currentColor\" rx=\"0.5\" opacity=\"0.7\"/>\n        <line x1=\"8\" y1=\"11\" x2=\"8\" y2=\"13.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.6\"/>\n        <line x1=\"13\" y1=\"3.5\" x2=\"13\" y2=\"5.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n        <rect x=\"11.5\" y=\"5.5\" width=\"3\" height=\"4.5\" fill=\"currentColor\" rx=\"0.5\"/>\n        <line x1=\"13\" y1=\"10\" x2=\"13\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n    </svg>`,\n\n    linemarkers: `<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <polyline points=\"1,13 4,8 7,10 10,4 13,6 15,3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\" stroke-linecap=\"round\"/>\n        <circle cx=\"1\"  cy=\"13\" r=\"1.5\" fill=\"currentColor\"/>\n        <circle cx=\"4\"  cy=\"8\"  r=\"1.5\" fill=\"currentColor\"/>\n        <circle cx=\"7\"  cy=\"10\" r=\"1.5\" fill=\"currentColor\"/>\n        <circle cx=\"10\" cy=\"4\"  r=\"1.5\" fill=\"currentColor\"/>\n        <circle cx=\"13\" cy=\"6\"  r=\"1.5\" fill=\"currentColor\"/>\n        <circle cx=\"15\" cy=\"3\"  r=\"1.5\" fill=\"currentColor\"/>\n    </svg>`,\n\n    step: `<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <polyline points=\"1,13 1,13 4,13 4,8 7,8 7,10 10,10 10,4 13,4 13,6 15,6 15,3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\" stroke-linecap=\"round\"/>\n    </svg>`,\n\n    hlcarea: `<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <path d=\"M1,11 L4,6 L7,8 L10,3 L13,5 L15,2 L15,8 L13,10 L10,9 L7,13 L4,11 L1,14 Z\" fill=\"currentColor\" opacity=\"0.2\"/>\n        <polyline points=\"1,11 4,6 7,8 10,3 13,5 15,2\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\" stroke-linecap=\"round\"/>\n    </svg>`,\n\n    baseline: `<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <line x1=\"1\" y1=\"8.5\" x2=\"15\" y2=\"8.5\" stroke=\"currentColor\" stroke-width=\"0.8\" stroke-dasharray=\"3 2\" opacity=\"0.5\"/>\n        <path d=\"M1,13 L4,8 L7,6 L10,4 L15,3 L15,8.5 L1,8.5 Z\" fill=\"currentColor\" opacity=\"0.2\"/>\n        <polyline points=\"1,13 4,8 7,6 10,4 15,3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\" stroke-linecap=\"round\"/>\n    </svg>`,\n\n    columns: `<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <rect x=\"1.5\" y=\"5\"  width=\"3\" height=\"9\" fill=\"currentColor\" rx=\"0.5\"/>\n        <rect x=\"6.5\" y=\"3\"  width=\"3\" height=\"11\" fill=\"currentColor\" rx=\"0.5\" opacity=\"0.7\"/>\n        <rect x=\"11.5\" y=\"7\" width=\"3\" height=\"7\" fill=\"currentColor\" rx=\"0.5\"/>\n    </svg>`,\n\n    highlow: `<svg viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n        <line x1=\"3\"  y1=\"2\"  x2=\"3\"  y2=\"12\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n        <line x1=\"8\"  y1=\"4\"  x2=\"8\"  y2=\"14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" opacity=\"0.65\"/>\n        <line x1=\"13\" y1=\"1\"  x2=\"13\" y2=\"10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n    </svg>`,\n};\n\n// ── LeftBar category icons (18×18) ────────────────────────────────────────────\n\n/** Category sidebar icons keyed by category id. */\nexport const ICON_CAT: Record<string, string> = {\n    trend_lines: mkSvg(\n        `<line x1=\"2\" y1=\"14\" x2=\"12\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <polyline points=\"7,4 12,4 12,9\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n        18\n    ),\n    fibonacci_gann: mkSvg(\n        `<line x1=\"3\" y1=\"3\" x2=\"3\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"3\" y1=\"4\" x2=\"13\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"3\" y1=\"8\" x2=\"13\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" opacity=\"0.7\"/>\n         <line x1=\"3\" y1=\"12\" x2=\"13\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1.1\" stroke-linecap=\"round\" opacity=\"0.5\"/>`,\n        18\n    ),\n    geometric_shapes: mkSvg(\n        `<rect x=\"2.5\" y=\"4.5\" width=\"11\" height=\"7\" rx=\"1\" stroke=\"currentColor\" stroke-width=\"1.5\"/>`,\n        18\n    ),\n    measurement_tools: mkSvg(\n        `<line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <polyline points=\"5,5 8,2 11,5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n         <polyline points=\"5,11 8,14 11,11\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n        18\n    ),\n    pitchfork_tools: mkSvg(\n        `<line x1=\"8\" y1=\"14\" x2=\"8\" y2=\"7\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"8\" y1=\"7\" x2=\"4\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"8\" y1=\"7\" x2=\"8\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"8\" y1=\"7\" x2=\"12\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>`,\n        18\n    ),\n    volume_statistics: mkSvg(\n        `<rect x=\"2\" y=\"9\" width=\"3\" height=\"5\" rx=\"0.5\" fill=\"currentColor\"/>\n         <rect x=\"6.5\" y=\"5\" width=\"3\" height=\"9\" rx=\"0.5\" fill=\"currentColor\" opacity=\"0.75\"/>\n         <rect x=\"11\" y=\"2\" width=\"3\" height=\"12\" rx=\"0.5\" fill=\"currentColor\" opacity=\"0.5\"/>`,\n        18\n    ),\n    annotation_tools: mkSvg(\n        `<path d=\"M2 3.5C2 2.67 2.67 2 3.5 2h9C13.33 2 14 2.67 14 3.5v6c0 .83-.67 1.5-1.5 1.5H7l-3 2.5V11H3.5C2.67 11 2 10.33 2 9.5V3.5z\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linejoin=\"round\"/>`,\n        18\n    ),\n    pattern_recognition: mkSvg(\n        `<polyline points=\"1,13 3.5,9 6,11 8,4 10,11 12.5,9 15,13\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n         <line x1=\"1\" y1=\"13\" x2=\"15\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.4\"/>`,\n        18\n    ),\n    elliott_wave: mkSvg(\n        `<path d=\"M1 9 C3 3,5 3,7 9 C9 15,11 15,13 9 C14 6,15 6,15 8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" fill=\"none\"/>`,\n        18\n    ),\n    brush_highlighter: mkSvg(\n        `<path d=\"M11.5 2.5l2 2-7.5 7.5-3 1 1-3 7.5-7.5z\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n         <line x1=\"9.5\" y1=\"4.5\" x2=\"11.5\" y2=\"6.5\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.5\"/>`,\n        18\n    ),\n    advanced_tools: mkSvg(\n        `<path d=\"M1 8 C3 4,5 4,7 8 C9 12,11 12,13 8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" fill=\"none\"/>\n         <circle cx=\"14.5\" cy=\"5.5\" r=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.2\"/>`,\n        18\n    ),\n    price_projections: mkSvg(\n        `<line x1=\"2\" y1=\"11\" x2=\"8\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"8\" y1=\"5\" x2=\"13.5\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-dasharray=\"2 1.5\"/>\n         <polyline points=\"10.5,2 13.5,5 10.5,8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n        18\n    ),\n};\n\n// ── LeftBar action button icons (16×16) ───────────────────────────────────────\n\n/** Action button icons keyed by action id. */\nexport const ICON_ACTION: Record<string, string> = {\n    undo: mkSvg(\n        `<path d=\"M3 8a5 5 0 1 1 1.4 3.5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" fill=\"none\"/>\n         <polyline points=\"2,5 3,9 7,8\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n        16\n    ),\n    redo: mkSvg(\n        `<path d=\"M13 8a5 5 0 1 0-1.4 3.5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" fill=\"none\"/>\n         <polyline points=\"14,5 13,9 9,8\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n        16\n    ),\n    delete_selected: mkSvg(\n        `<line x1=\"4\" y1=\"4\" x2=\"12\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"12\" y1=\"4\" x2=\"4\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>`,\n        16\n    ),\n    clear_all: mkSvg(\n        `<polyline points=\"3.5,5 4.5,13.5 11.5,13.5 12.5,5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n         <line x1=\"2\" y1=\"5\" x2=\"14\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>\n         <path d=\"M6 5V3.5C6 3 6.5 2.5 7 2.5h2C9.5 2.5 10 3 10 3.5V5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>`,\n        16\n    ),\n    toggle_visibility: mkSvg(\n        `<path d=\"M1.5 8C3 5 5.5 3.5 8 3.5S13 5 14.5 8C13 11 10.5 12.5 8 12.5S3 11 1.5 8z\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>\n         <circle cx=\"8\" cy=\"8\" r=\"2\" stroke=\"currentColor\" stroke-width=\"1.4\"/>`,\n        16\n    ),\n    toggle_lock: mkSvg(\n        `<rect x=\"3.5\" y=\"7.5\" width=\"9\" height=\"7\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.4\"/>\n         <path d=\"M5.5 7.5V5.5a2.5 2.5 0 0 1 5 0\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>`,\n        16\n    ),\n};\n\n/** Toggled states for visibility (hidden) and lock (locked). */\nexport const ICON_ACTION_TOGGLED: Partial<Record<string, string>> = {\n    toggle_visibility: mkSvg(\n        `<path d=\"M1.5 8C3 5 5.5 3.5 8 3.5S13 5 14.5 8C13 11 10.5 12.5 8 12.5S3 11 1.5 8z\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" opacity=\"0.35\"/>\n         <line x1=\"3\" y1=\"3\" x2=\"13\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>`,\n        16\n    ),\n    toggle_lock: mkSvg(\n        `<rect x=\"3.5\" y=\"7.5\" width=\"9\" height=\"7\" rx=\"1.5\" stroke=\"currentColor\" stroke-width=\"1.4\"/>\n         <path d=\"M5.5 7.5V5.5a2.5 2.5 0 0 1 5 0v2\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>`,\n        16\n    ),\n};\n\n// ── Eye icons (reused from toggle_visibility action) ──────────────────────────\n\n/** Eye open — indicator visible. Alias of ICON_ACTION['toggle_visibility']. */\nexport const ICON_EYE: string = ICON_ACTION['toggle_visibility']!;\n\n/** Eye with slash — indicator hidden. Alias of ICON_ACTION_TOGGLED['toggle_visibility']. */\nexport const ICON_EYE_OFF: string = ICON_ACTION_TOGGLED['toggle_visibility']!;\n\n// ── LeftBar individual tool icons (14×14) ─────────────────────────────────────\n\n/** Individual drawing tool icons keyed by tool id. */\nexport const ICON_TOOL: Record<string, string> = {\n    // Trend Lines & Channels\n    trend_line: mkSvg(\n        `<line x1=\"2\" y1=\"14\" x2=\"12\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <polyline points=\"7,4 12,4 12,9\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n        14\n    ),\n    trend_angle: mkSvg(\n        `<line x1=\"3\" y1=\"13\" x2=\"13\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <path d=\"M3 13 L9 13\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.6\"/>\n         <path d=\"M3 13 A6 6 0 0 0 8.5 8.5\" stroke=\"currentColor\" stroke-width=\"1\" fill=\"none\" opacity=\"0.7\"/>`,\n        14\n    ),\n    horizontal_line: mkSvg(\n        `<line x1=\"2\" y1=\"8\" x2=\"14\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>`,\n        14\n    ),\n    vertical_line: mkSvg(\n        `<line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>`,\n        14\n    ),\n    cross_line: mkSvg(\n        `<line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"2\" y1=\"8\" x2=\"14\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>`,\n        14\n    ),\n    parallel_channel: mkSvg(\n        `<line x1=\"2\" y1=\"11\" x2=\"12\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"4\" y1=\"14\" x2=\"14\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" opacity=\"0.6\"/>`,\n        14\n    ),\n    disjoint_channel: mkSvg(\n        `<line x1=\"2\" y1=\"10\" x2=\"12\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"3\" y1=\"14\" x2=\"14\" y2=\"10\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" opacity=\"0.6\"/>`,\n        14\n    ),\n    flat_channel: mkSvg(\n        `<line x1=\"2\" y1=\"5\" x2=\"14\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"2\" y1=\"11\" x2=\"14\" y2=\"11\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" opacity=\"0.6\"/>`,\n        14\n    ),\n    // Fibonacci & Gann\n    fib_retracement: mkSvg(\n        `<line x1=\"3\" y1=\"3\" x2=\"3\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"3\" y1=\"4\" x2=\"13\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>\n         <line x1=\"3\" y1=\"8\" x2=\"13\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.7\"/>\n         <line x1=\"3\" y1=\"12\" x2=\"13\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.5\"/>`,\n        14\n    ),\n    fib_extension: mkSvg(\n        `<line x1=\"3\" y1=\"2\" x2=\"3\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"3\" y1=\"3\" x2=\"13\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>\n         <line x1=\"3\" y1=\"7\" x2=\"13\" y2=\"7\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.7\"/>\n         <line x1=\"3\" y1=\"11\" x2=\"13\" y2=\"11\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.5\"/>\n         <line x1=\"3\" y1=\"14\" x2=\"13\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.35\"/>`,\n        14\n    ),\n    fib_channel: mkSvg(\n        `<line x1=\"2\" y1=\"12\" x2=\"12\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"4\" y1=\"14\" x2=\"14\" y2=\"6\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.6\"/>\n         <line x1=\"3\" y1=\"13\" x2=\"13\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.4\"/>`,\n        14\n    ),\n    fib_timezone: mkSvg(\n        `<line x1=\"4\" y1=\"3\" x2=\"4\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"7\" y1=\"3\" x2=\"7\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" opacity=\"0.75\"/>\n         <line x1=\"11\" y1=\"3\" x2=\"11\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.1\" stroke-linecap=\"round\" opacity=\"0.55\"/>`,\n        14\n    ),\n    fib_circles: mkSvg(\n        `<circle cx=\"8\" cy=\"8\" r=\"2\" stroke=\"currentColor\" stroke-width=\"1.4\"/>\n         <circle cx=\"8\" cy=\"8\" r=\"5\" stroke=\"currentColor\" stroke-width=\"1\" opacity=\"0.6\"/>`,\n        14\n    ),\n    fib_spiral: mkSvg(\n        `<path d=\"M8 8 C8 5,11 5,11 8 C11 12,5 12,5 8 C5 3,13 3,13 8\" stroke=\"currentColor\" stroke-width=\"1.3\" fill=\"none\" stroke-linecap=\"round\"/>`,\n        14\n    ),\n    fib_fan: mkSvg(\n        `<line x1=\"3\" y1=\"13\" x2=\"13\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>\n         <line x1=\"3\" y1=\"13\" x2=\"13\" y2=\"7\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.7\"/>\n         <line x1=\"3\" y1=\"13\" x2=\"13\" y2=\"11\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.5\"/>`,\n        14\n    ),\n    gann_fan: mkSvg(\n        `<line x1=\"3\" y1=\"13\" x2=\"13\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>\n         <line x1=\"3\" y1=\"13\" x2=\"13\" y2=\"6\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.7\"/>\n         <line x1=\"3\" y1=\"13\" x2=\"13\" y2=\"10\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.5\"/>`,\n        14\n    ),\n    gann_square: mkSvg(\n        `<rect x=\"3\" y=\"3\" width=\"10\" height=\"10\" stroke=\"currentColor\" stroke-width=\"1.4\"/>\n         <line x1=\"3\" y1=\"3\" x2=\"13\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1\" opacity=\"0.5\"/>\n         <line x1=\"3\" y1=\"13\" x2=\"13\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1\" opacity=\"0.5\"/>`,\n        14\n    ),\n    gann_box: mkSvg(\n        `<rect x=\"3\" y=\"3\" width=\"10\" height=\"10\" stroke=\"currentColor\" stroke-width=\"1.4\"/>\n         <line x1=\"8\" y1=\"3\" x2=\"8\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1\" opacity=\"0.5\"/>\n         <line x1=\"3\" y1=\"8\" x2=\"13\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1\" opacity=\"0.5\"/>`,\n        14\n    ),\n    // Geometric Shapes\n    rectangle: mkSvg(\n        `<rect x=\"2.5\" y=\"4.5\" width=\"11\" height=\"7\" rx=\"0.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>`,\n        14\n    ),\n    rotated_rectangle: mkSvg(\n        `<rect x=\"4\" y=\"4\" width=\"8\" height=\"8\" rx=\"0.5\" stroke=\"currentColor\" stroke-width=\"1.5\" transform=\"rotate(45 8 8)\"/>`,\n        14\n    ),\n    ellipse: mkSvg(\n        `<ellipse cx=\"8\" cy=\"8\" rx=\"6\" ry=\"4\" stroke=\"currentColor\" stroke-width=\"1.5\"/>`,\n        14\n    ),\n    triangle: mkSvg(\n        `<polygon points=\"8,2 14,13 2,13\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\"/>`,\n        14\n    ),\n    circle: mkSvg(`<circle cx=\"8\" cy=\"8\" r=\"5.5\" stroke=\"currentColor\" stroke-width=\"1.5\"/>`, 14),\n    arc: mkSvg(\n        `<path d=\"M3 12 A7 7 0 0 1 13 12\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" fill=\"none\"/>`,\n        14\n    ),\n    polyline: mkSvg(\n        `<polyline points=\"2,12 5,5 8,10 11,5 14,9\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n        14\n    ),\n    path: mkSvg(\n        `<path d=\"M2 12 C4 5,6 5,8 8 C10 11,12 11,14 5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" fill=\"none\"/>`,\n        14\n    ),\n    // Measurement Tools\n    price_range: mkSvg(\n        `<line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <polyline points=\"5,5 8,2 11,5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n         <polyline points=\"5,11 8,14 11,11\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n        14\n    ),\n    date_range: mkSvg(\n        `<line x1=\"2\" y1=\"8\" x2=\"14\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <polyline points=\"5,5 2,8 5,11\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n         <polyline points=\"11,5 14,8 11,11\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n        14\n    ),\n    date_price_range: mkSvg(\n        `<rect x=\"2.5\" y=\"3.5\" width=\"11\" height=\"9\" stroke=\"currentColor\" stroke-width=\"1.4\"/>\n         <line x1=\"2.5\" y1=\"3.5\" x2=\"13.5\" y2=\"12.5\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.6\"/>`,\n        14\n    ),\n    ruler: mkSvg(\n        `<line x1=\"2\" y1=\"8\" x2=\"14\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"4\" y1=\"6\" x2=\"4\" y2=\"10\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n         <line x1=\"7\" y1=\"7\" x2=\"7\" y2=\"9\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n         <line x1=\"10\" y1=\"6\" x2=\"10\" y2=\"10\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n         <line x1=\"13\" y1=\"7\" x2=\"13\" y2=\"9\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>`,\n        14\n    ),\n    // Pitchfork Tools\n    pitchfork: mkSvg(\n        `<line x1=\"8\" y1=\"14\" x2=\"8\" y2=\"7\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"8\" y1=\"7\" x2=\"4\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"8\" y1=\"7\" x2=\"8\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"8\" y1=\"7\" x2=\"12\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>`,\n        14\n    ),\n    schiff_pitchfork: mkSvg(\n        `<line x1=\"8\" y1=\"14\" x2=\"8\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"8\" y1=\"8\" x2=\"4\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"8\" y1=\"8\" x2=\"9\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"8\" y1=\"8\" x2=\"13\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>`,\n        14\n    ),\n    modified_schiff: mkSvg(\n        `<line x1=\"8\" y1=\"14\" x2=\"7\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"7\" y1=\"8\" x2=\"3\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"7\" y1=\"8\" x2=\"8\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"7\" y1=\"8\" x2=\"13\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>`,\n        14\n    ),\n    inside_pitchfork: mkSvg(\n        `<line x1=\"8\" y1=\"14\" x2=\"8\" y2=\"7\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"8\" y1=\"7\" x2=\"4\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"8\" y1=\"7\" x2=\"8\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"8\" y1=\"7\" x2=\"12\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"6\" y1=\"5\" x2=\"10\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.5\"/>`,\n        14\n    ),\n    // Volume & Statistical\n    fixed_range_vp: mkSvg(\n        `<rect x=\"2\" y=\"3\" width=\"7\" height=\"10\" stroke=\"currentColor\" stroke-width=\"1.2\" opacity=\"0.5\"/>\n         <line x1=\"9\" y1=\"5\" x2=\"14\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n         <line x1=\"9\" y1=\"8\" x2=\"13\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" opacity=\"0.75\"/>\n         <line x1=\"9\" y1=\"11\" x2=\"11\" y2=\"11\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" opacity=\"0.5\"/>`,\n        14\n    ),\n    anchored_vp: mkSvg(\n        `<circle cx=\"5\" cy=\"5\" r=\"2\" stroke=\"currentColor\" stroke-width=\"1.3\"/>\n         <line x1=\"5\" y1=\"7\" x2=\"5\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" opacity=\"0.5\"/>\n         <line x1=\"7\" y1=\"7\" x2=\"12\" y2=\"7\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n         <line x1=\"7\" y1=\"10\" x2=\"11\" y2=\"10\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" opacity=\"0.7\"/>\n         <line x1=\"7\" y1=\"13\" x2=\"9\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" opacity=\"0.45\"/>`,\n        14\n    ),\n    volume_profile: mkSvg(\n        `<line x1=\"3\" y1=\"4\" x2=\"11\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/>\n         <line x1=\"3\" y1=\"7\" x2=\"14\" y2=\"7\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" opacity=\"0.75\"/>\n         <line x1=\"3\" y1=\"10\" x2=\"9\" y2=\"10\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" opacity=\"0.55\"/>\n         <line x1=\"3\" y1=\"13\" x2=\"7\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" opacity=\"0.35\"/>`,\n        14\n    ),\n    regression_trend: mkSvg(\n        `<line x1=\"2\" y1=\"12\" x2=\"13\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"2\" y1=\"9\" x2=\"13\" y2=\"1\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-dasharray=\"2 1.5\" opacity=\"0.6\"/>\n         <line x1=\"2\" y1=\"15\" x2=\"13\" y2=\"7\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-dasharray=\"2 1.5\" opacity=\"0.6\"/>`,\n        14\n    ),\n    // Annotations\n    text: mkSvg(\n        `<line x1=\"3\" y1=\"4\" x2=\"13\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"8\" y1=\"4\" x2=\"8\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>`,\n        14\n    ),\n    callout: mkSvg(\n        `<path d=\"M2 3.5C2 2.67 2.67 2 3.5 2h9C13.33 2 14 2.67 14 3.5v5c0 .83-.67 1.5-1.5 1.5H8l-2.5 3V9H3.5C2.67 9 2 8.33 2 7.5V3.5z\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linejoin=\"round\"/>`,\n        14\n    ),\n    price_label: mkSvg(\n        `<path d=\"M2 8 L5 5 H13.5C14 5 14.5 5.5 14.5 6v4c0 .5-.5 1-1 1H5L2 8z\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linejoin=\"round\"/>`,\n        14\n    ),\n    arrow_marker: mkSvg(\n        `<line x1=\"3\" y1=\"8\" x2=\"12\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <polyline points=\"9,5 12,8 9,11\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n        14\n    ),\n    flag: mkSvg(\n        `<line x1=\"4\" y1=\"2\" x2=\"4\" y2=\"14\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <path d=\"M4 3 L12 3 L10 7 L4 7z\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linejoin=\"round\"/>`,\n        14\n    ),\n    price_note: mkSvg(\n        `<rect x=\"2.5\" y=\"4\" width=\"11\" height=\"8\" rx=\"1\" stroke=\"currentColor\" stroke-width=\"1.3\"/>\n         <line x1=\"5\" y1=\"7\" x2=\"11\" y2=\"7\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>\n         <line x1=\"5\" y1=\"9.5\" x2=\"9\" y2=\"9.5\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\"/>`,\n        14\n    ),\n    anchored_note: mkSvg(\n        `<circle cx=\"8\" cy=\"5\" r=\"2.5\" stroke=\"currentColor\" stroke-width=\"1.3\"/>\n         <line x1=\"8\" y1=\"7.5\" x2=\"8\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-dasharray=\"1.5 1.5\"/>`,\n        14\n    ),\n    arrow_up: mkSvg(\n        `<line x1=\"8\" y1=\"13\" x2=\"8\" y2=\"3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <polyline points=\"4,7 8,3 12,7\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n        14\n    ),\n    arrow_down: mkSvg(\n        `<line x1=\"8\" y1=\"3\" x2=\"8\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <polyline points=\"4,9 8,13 12,9\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n        14\n    ),\n    // Pattern Recognition\n    head_shoulders: mkSvg(\n        `<polyline points=\"1,13 3.5,10 5.5,12 8,4 10.5,12 12.5,10 15,13\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n         <line x1=\"1\" y1=\"13\" x2=\"15\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.4\"/>`,\n        14\n    ),\n    triangle_pattern: mkSvg(\n        `<line x1=\"2\" y1=\"4\" x2=\"14\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>\n         <line x1=\"2\" y1=\"12\" x2=\"14\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" opacity=\"0.7\"/>\n         <line x1=\"2\" y1=\"4\" x2=\"2\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>`,\n        14\n    ),\n    three_drives: mkSvg(\n        `<polyline points=\"2,12 4,7 6,10 8,5 10,9 12,4 14,9\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n        14\n    ),\n    abcd_pattern: mkSvg(\n        `<polyline points=\"3,12 6,4 9,10 12,3\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n         <circle cx=\"3\" cy=\"12\" r=\"1\" fill=\"currentColor\"/>\n         <circle cx=\"6\" cy=\"4\" r=\"1\" fill=\"currentColor\"/>\n         <circle cx=\"9\" cy=\"10\" r=\"1\" fill=\"currentColor\"/>\n         <circle cx=\"12\" cy=\"3\" r=\"1\" fill=\"currentColor\"/>`,\n        14\n    ),\n    cypher_pattern: mkSvg(\n        `<polyline points=\"2,12 5,5 8,9 11,3 14,8\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n        14\n    ),\n    butterfly_pattern: mkSvg(\n        `<polyline points=\"3,12 6,5 8,10 10,5 13,12\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n         <line x1=\"3\" y1=\"12\" x2=\"13\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.4\"/>`,\n        14\n    ),\n    bat_pattern: mkSvg(\n        `<polyline points=\"3,11 5.5,5 8,9 10.5,4 13,9\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n        14\n    ),\n    gartley_pattern: mkSvg(\n        `<polyline points=\"3,12 5.5,4 8,9 10.5,3 13,8\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n        14\n    ),\n    crab_pattern: mkSvg(\n        `<polyline points=\"2,11 5,5 7,9 10,3 14,11\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n        14\n    ),\n    shark_pattern: mkSvg(\n        `<polyline points=\"2,12 5,6 8,11 11,4 14,10\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n        14\n    ),\n    // Elliott Wave\n    elliott_impulse: mkSvg(\n        `<polyline points=\"2,12 4,5 6,10 8,3 10,8 12,4 14,8\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n        14\n    ),\n    elliott_corrective: mkSvg(\n        `<polyline points=\"2,5 5,12 8,7 11,12 14,5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n        14\n    ),\n    elliott_triangle: mkSvg(\n        `<polyline points=\"2,4 6,12 8,7 10,12 14,4\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n         <line x1=\"2\" y1=\"4\" x2=\"14\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.4\"/>`,\n        14\n    ),\n    elliott_combination: mkSvg(\n        `<polyline points=\"2,12 4,5 6,10 8,3 10,9 13,4\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n        14\n    ),\n    elliott_wxy: mkSvg(\n        `<polyline points=\"2,5 5,12 8,6 11,13 14,7\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n        14\n    ),\n    // Brush & Highlighter\n    brush: mkSvg(\n        `<path d=\"M11.5 2.5l2 2-7.5 7.5-3 1 1-3 7.5-7.5z\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n         <line x1=\"9.5\" y1=\"4.5\" x2=\"11.5\" y2=\"6.5\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" opacity=\"0.5\"/>`,\n        14\n    ),\n    highlighter: mkSvg(\n        `<path d=\"M10 3l3 3-6 6H4v-3l6-6z\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n         <line x1=\"4\" y1=\"13\" x2=\"12\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" opacity=\"0.6\"/>`,\n        14\n    ),\n    // Advanced Tools\n    ghost_feed: mkSvg(\n        `<path d=\"M5 6a3 3 0 0 1 6 0v5l1.5 2h-9L5 11V6z\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n         <line x1=\"6.5\" y1=\"13.5\" x2=\"9.5\" y2=\"13.5\" stroke=\"currentColor\" stroke-width=\"1.3\" stroke-linecap=\"round\"/>`,\n        14\n    ),\n    projection: mkSvg(\n        `<line x1=\"2\" y1=\"11\" x2=\"8\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"8\" y1=\"5\" x2=\"13.5\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-dasharray=\"2 1.5\"/>\n         <polyline points=\"10.5,2.5 13.5,5 10.5,7.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n        14\n    ),\n    sine_line: mkSvg(\n        `<path d=\"M1 8 C3 4,5 4,7 8 C9 12,11 12,13 8 C14 6,15 6,15 7\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" fill=\"none\"/>`,\n        14\n    ),\n    cyclic_lines: mkSvg(\n        `<line x1=\"4\" y1=\"3\" x2=\"4\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-dasharray=\"1.5 1.5\"/>\n         <line x1=\"8\" y1=\"3\" x2=\"8\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-dasharray=\"1.5 1.5\"/>\n         <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-dasharray=\"1.5 1.5\"/>`,\n        14\n    ),\n    time_cycles: mkSvg(\n        `<ellipse cx=\"5\" cy=\"8\" rx=\"3\" ry=\"5\" stroke=\"currentColor\" stroke-width=\"1.3\" opacity=\"0.9\"/>\n         <ellipse cx=\"11\" cy=\"8\" rx=\"3\" ry=\"5\" stroke=\"currentColor\" stroke-width=\"1.3\" opacity=\"0.6\"/>`,\n        14\n    ),\n    // Price Projections\n    fib_projection: mkSvg(\n        `<line x1=\"3\" y1=\"3\" x2=\"3\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"3\" y1=\"4\" x2=\"13\" y2=\"4\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>\n         <line x1=\"3\" y1=\"8\" x2=\"13\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.2\" stroke-linecap=\"round\" opacity=\"0.7\"/>\n         <line x1=\"3\" y1=\"12\" x2=\"13\" y2=\"12\" stroke=\"currentColor\" stroke-width=\"1\" stroke-linecap=\"round\" stroke-dasharray=\"2 1.5\" opacity=\"0.5\"/>`,\n        14\n    ),\n    price_projection: mkSvg(\n        `<line x1=\"2\" y1=\"11\" x2=\"8\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\n         <line x1=\"8\" y1=\"5\" x2=\"13.5\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-dasharray=\"2 1.5\"/>\n         <polyline points=\"10.5,2.5 13.5,5 10.5,7.5\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`,\n        14\n    ),\n};\n\n// ── TFC (Trade from Charts) toggle icons ─────────────────────────────────────\n\n/** TFC enabled — two crossing zigzag arrows (green up, red down) for trade-from-chart. */\nexport const ICON_TFC =\n    `<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n    // Green zigzag arrow going up-right\n    `<polyline points=\"1.5,12.5 5,9 7,11 14,4\" stroke=\"#26a69a\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n    `<polyline points=\"10,4 14,4 14,8\" stroke=\"#26a69a\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n    // Red zigzag arrow going down-right\n    `<polyline points=\"1.5,3.5 5,7 7,5 14,12\" stroke=\"#ef5350\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n    `<polyline points=\"10,12 14,12 14,8\" stroke=\"#ef5350\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n    `</svg>`;\n\n/** TFC disabled — same crossing arrows but dimmed with diagonal slash. */\nexport const ICON_TFC_OFF =\n    `<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n    // Green zigzag arrow going up-right (dimmed)\n    `<polyline points=\"1.5,12.5 5,9 7,11 14,4\" stroke=\"#26a69a\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" opacity=\"0.3\"/>` +\n    `<polyline points=\"10,4 14,4 14,8\" stroke=\"#26a69a\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" opacity=\"0.3\"/>` +\n    // Red zigzag arrow going down-right (dimmed)\n    `<polyline points=\"1.5,3.5 5,7 7,5 14,12\" stroke=\"#ef5350\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" opacity=\"0.3\"/>` +\n    `<polyline points=\"10,12 14,12 14,8\" stroke=\"#ef5350\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" opacity=\"0.3\"/>` +\n    // Diagonal slash\n    `<line x1=\"3\" y1=\"3\" x2=\"13\" y2=\"13\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>` +\n    `</svg>`;\n\n// ── Color-function icons ──────────────────────────────────────────────────────\n// Used inside ChartEngine's floating buttons via CSS background-image data URI,\n// so the hex stroke color is baked in directly (no `currentColor` dependency).\n\n/**\n * Skip-to-latest icon (two filled arrows + vertical end bar).\n *\n * Geometry (16×16 viewBox):\n *   Arrow 1  (1,4)→(6,8)→(1,12)  — filled right-pointing triangle.\n *   Arrow 2  (6,4)→(11,8)→(6,12) — filled right-pointing triangle.\n *   Bar      x=13.5, y=3.5→12.5  — stop/end marker (rounded cap).\n *   Content spans x=1–14 (centre x=7.5) and y=3.5–12.5 (centre y=8). ✓\n */\nexport const iconScrollToEnd = (c: string, size = 16): string =>\n    `<svg viewBox=\"0 0 16 16\" width=\"${size}\" height=\"${size}\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n    `<path d=\"M1 4L6 8L1 12Z\" fill=\"${c}\"/>` +\n    `<path d=\"M6 4L11 8L6 12Z\" fill=\"${c}\"/>` +\n    `<line x1=\"13.5\" y1=\"3.5\" x2=\"13.5\" y2=\"12.5\" stroke=\"${c}\" stroke-width=\"2\" stroke-linecap=\"round\"/>` +\n    `</svg>`;\n\n/**\n * Reset-view / refresh icon (270° clockwise arc + arrowhead).\n *\n * Geometry (16×16 viewBox, circle centre (8,8) radius 6):\n *   Arc start  (8, 2)  — top of circle    (angle 270°)\n *   Arc end    (2, 8)  — left of circle   (angle 180°)\n *   Sweep: CW (flag=1), large-arc (flag=1) → 270° arc going right→bottom→left.\n *   Arrowhead  (4,10)→(2,8)→(1,10) — tip at (2,8), pointing upward,\n *              which is the CW tangent direction at the leftmost point. ✓\n */\nexport const iconResetView = (c: string, size = 16): string =>\n    `<svg viewBox=\"0 0 16 16\" width=\"${size}\" height=\"${size}\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n    `<path d=\"M8 2A6 6 0 1 1 2 8\" stroke=\"${c}\" stroke-width=\"1.6\" stroke-linecap=\"round\"/>` +\n    `<path d=\"M4 10L2 8L1 10\" stroke=\"${c}\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n    `</svg>`;\n\n// ── Settings dialog tab icons ─────────────────────────────────────────────────\n\n/** Tab icons for ChartSettingsDialog sidebar (appearance / tools / trading). */\nexport const ICON_TAB: Record<'appearance' | 'tools' | 'trading', string> = {\n    appearance: `<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"8\" cy=\"8\" r=\"3\" stroke=\"currentColor\" stroke-width=\"1.4\"/><path d=\"M8 1v1.5M8 13.5V15M1 8h1.5M13.5 8H15M3.05 3.05l1.06 1.06M11.89 11.89l1.06 1.06M3.05 12.95l1.06-1.06M11.89 4.11l1.06-1.06\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/></svg>`,\n    tools:      `<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M2 14l4-4M10 2l4 4-7 7-4-4z\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M13 3l1 1\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/></svg>`,\n    trading:    `<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M1 12l4-5 3 2 4-6\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M11 3h4v4\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>`,\n};\n\n// ── Small close icon (12×12) ──────────────────────────────────────────────────\n\n/** Close × icon at 12×12 — used in dialog headers. */\nexport const ICON_CLOSE_SM =\n    `<svg viewBox=\"0 0 12 12\" width=\"12\" height=\"12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n    `<path d=\"M1 1l10 10M11 1L1 11\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>` +\n    `</svg>`;\n\n// ── Indicator overlay icons ───────────────────────────────────────────────────\n\n/** Solid circle bullet — used as colour dot in indicator pills. */\nexport const ICON_BULLET =\n    `<svg viewBox=\"0 0 10 10\" width=\"10\" height=\"10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n    `<circle cx=\"5\" cy=\"5\" r=\"4\" fill=\"currentColor\"/>` +\n    `</svg>`;\n\n// ── Dropdown / list icons ─────────────────────────────────────────────────────\n\n/** Checkmark tick — used to mark the active item in dropdowns. */\nexport const ICON_CHECKMARK =\n    `<svg viewBox=\"0 0 12 12\" width=\"10\" height=\"10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n    `<path d=\"M1.5 6l3.5 3.5 5.5-6\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n    `</svg>`;\n\n// ── Action / button icons ─────────────────────────────────────────────────────\n\n/** Plus-in-circle ⊕ — used on the Trade button. */\nexport const ICON_PLUS_CIRCLE =\n    `<svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n    `<circle cx=\"8\" cy=\"8\" r=\"6.5\" stroke=\"currentColor\" stroke-width=\"1.4\"/>` +\n    `<line x1=\"8\" y1=\"4.5\" x2=\"8\" y2=\"11.5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>` +\n    `<line x1=\"4.5\" y1=\"8\" x2=\"11.5\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\"/>` +\n    `</svg>`;\n\n/** Chevron pointing up — used on scroll buttons. */\nexport const ICON_CHEVRON_UP =\n    `<svg viewBox=\"0 0 10 10\" width=\"10\" height=\"10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n    `<polyline points=\"2,7 5,3 8,7\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n    `</svg>`;\n\n/** Chevron pointing down — used on scroll buttons. */\nexport const ICON_CHEVRON_DOWN =\n    `<svg viewBox=\"0 0 10 10\" width=\"10\" height=\"10\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">` +\n    `<polyline points=\"2,3 5,7 8,3\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>` +\n    `</svg>`;\n\n/** Three horizontal dots — used as the combined actions button in mobile LeftBar. */\nexport const ICON_MORE_ACTIONS = mkSvg(\n    `<circle cx=\"4\" cy=\"8\" r=\"1.3\" fill=\"currentColor\"/>` +\n    `<circle cx=\"8\" cy=\"8\" r=\"1.3\" fill=\"currentColor\"/>` +\n    `<circle cx=\"12\" cy=\"8\" r=\"1.3\" fill=\"currentColor\"/>`,\n    14,\n);\n","/**\n * Helpers for making fixed-positioned overlay inputs behave well when the\n * mobile virtual keyboard opens.\n *\n * Two pieces:\n *  1. `enableKeyboardOverlayMode()` — opt into Chrome's VirtualKeyboard API\n *     so the keyboard overlays content instead of shrinking the viewport\n *     (avoids the chart \"jumping\" when an input is focused on Android Chrome).\n *  2. `observeKeyboard(el, getIntendedTop)` / `observeKeyboardTransform(el)`\n *     — on browsers that still resize the visual viewport (iOS Safari, Firefox\n *     Android, Samsung Internet), shift the overlay up so it stays above the\n *     keyboard.\n *\n * Note: on iOS Safari the real root cause of chart distortion is the browser\n * auto-zoom that fires when an input has `font-size < 16px`. Library inputs\n * are sized at 16px to suppress that zoom; we deliberately do NOT force a\n * scroll-reset or canvas re-layout on keyboard close, because doing so\n * interleaves with iOS's synthetic click dispatch and silently drops the\n * user's next tap.\n */\n\ninterface VirtualKeyboard {\n    overlaysContent: boolean;\n}\n\nlet _overlayEnabled = false;\n\nexport function enableKeyboardOverlayMode(): void {\n    if (_overlayEnabled) return;\n    _overlayEnabled = true;\n    const vk = (navigator as unknown as { virtualKeyboard?: VirtualKeyboard }).virtualKeyboard;\n    if (vk) {\n        try { vk.overlaysContent = true; } catch { /* unsupported */ }\n    }\n}\n\n/**\n * Keeps a fixed-positioned element visible above the virtual keyboard.\n * `getIntendedTop()` returns the desired `top` value in px when no keyboard\n * is showing. Call the returned disposer to stop observing.\n */\nexport function observeKeyboard(\n    el: HTMLElement,\n    getIntendedTop: () => number,\n): () => void {\n    const vv = window.visualViewport;\n    if (!vv) return () => {};\n\n    const update = (): void => {\n        if (el.style.display === 'none' || !el.isConnected) return;\n        const intendedTop = getIntendedTop();\n        const height      = el.getBoundingClientRect().height;\n        const vvBottom    = vv.offsetTop + vv.height;\n        const fits        = intendedTop + height <= vvBottom - 8;\n        el.style.top = fits\n            ? `${intendedTop}px`\n            : `${Math.max(8, vvBottom - height - 8)}px`;\n    };\n\n    vv.addEventListener('resize', update);\n    vv.addEventListener('scroll', update);\n    return () => {\n        vv.removeEventListener('resize', update);\n        vv.removeEventListener('scroll', update);\n    };\n}\n\n/**\n * For elements whose position is determined by layout (flex-centered modals,\n * inset:0 backdrops, etc.) and therefore can't be nudged via `top`. Applies a\n * translateY offset when the element would otherwise sit under the virtual\n * keyboard, and clears it when the keyboard closes.\n */\nexport function observeKeyboardTransform(el: HTMLElement): () => void {\n    const vv = window.visualViewport;\n    if (!vv) return () => {};\n\n    const update = (): void => {\n        if (!el.isConnected || el.offsetParent === null) return;\n        // Measure without the current offset so we don't feed back on itself.\n        el.style.transform = '';\n        const rect     = el.getBoundingClientRect();\n        const vvBottom = vv.offsetTop + vv.height;\n        const overflow = rect.bottom - (vvBottom - 8);\n        if (overflow > 0) {\n            el.style.transform = `translateY(${-overflow}px)`;\n        }\n    };\n\n    vv.addEventListener('resize', update);\n    vv.addEventListener('scroll', update);\n    return () => {\n        vv.removeEventListener('resize', update);\n        vv.removeEventListener('scroll', update);\n    };\n}\n","import type { SeriesType, Timeframe, Duration } from '../core/types.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { DEFAULT_TOP_BAR_CONFIG, type TopBarUiConfig } from '../core/uiConfig.js';\nimport { DEFAULT_LABELS, type TopBarLabels } from '../core/labels.js';\nimport { ICON_SETTINGS, ICON_FULLSCREEN_ENTER, ICON_FULLSCREEN_EXIT, ICON_SERIES, ICON_CHECKMARK, ICON_PENCIL, ICON_TFC, ICON_TFC_OFF } from './icons.js';\nimport { observeKeyboardTransform } from './keyboardAware.js';\n\nconst DURATIONS: Duration[] = ['1D', '5D', '1M', '3M', '6M', '1Y', '5Y', 'All'];\n\n/** Indicators that require volume data — disabled in the flyout when no volume is present. */\nconst VOLUME_REQUIRED = new Set(['VOL', 'VWAP', 'OBV', 'A/D', 'MFI', 'CMF']);\n\ntype DropdownId = 'series' | 'timeframe' | 'indicators' | 'duration';\n\n\n// ── Scrollbar CSS (injected once) ────────────────────────────────────────────\n\nfunction injectFlyoutScrollbarStyles(): void {\n    if (document.getElementById('finchart-flyout-scrollbar')) return;\n    const style = document.createElement('style');\n    style.id = 'finchart-flyout-scrollbar';\n    style.textContent = `\n        .finchart-flyout::-webkit-scrollbar { width: 4px; }\n        .finchart-flyout::-webkit-scrollbar-track { background: transparent; }\n        .finchart-flyout::-webkit-scrollbar-thumb { background: rgba(120,130,150,0.35); border-radius: 4px; }\n        .finchart-flyout::-webkit-scrollbar-thumb:hover { background: rgba(120,130,150,0.6); }\n        .finchart-flyout-row:hover { background: var(--finchart-row-hover) !important; }\n    `;\n    document.head.appendChild(style);\n}\n\nexport class TopBar {\n    readonly el:           HTMLDivElement;\n    private leftGroup:     HTMLDivElement;\n    private rightGroup:    HTMLDivElement;\n    private seriesBtn:     HTMLButtonElement;\n    private tfBtn:         HTMLButtonElement;\n    private indBtn:        HTMLButtonElement;\n    private fullscreenBtn: HTMLButtonElement | null = null;\n    private settingsBtn:   HTMLButtonElement | null = null;\n    private isFullscreen   = false;\n    private durationBtns   = new Map<Duration, HTMLButtonElement>();\n    private durationSep:   HTMLDivElement;\n    private durationDropBtn: HTMLButtonElement;\n    private isMobileLayout = false;\n    private activeDuration: Duration | null;\n    private durationMap:   Record<Duration, Timeframe>;\n    private theme:         ChartTheme;\n    private cfg:           TopBarUiConfig;\n    private labels:        TopBarLabels;\n\n    private drawingBtn:       HTMLButtonElement | null = null;\n    private tfcBtn:           HTMLButtonElement | null = null;\n    private tfcActive         = true;\n\n    private flyout:          HTMLDivElement;\n    private openDropdown:    DropdownId | null = null;\n    private docClickHandler: (e: MouseEvent) => void;\n    private disposeFlyoutKbd: () => void = () => {};\n\n    private currentSeries:    SeriesType;\n    private currentTf:        Timeframe;\n    private indicatorOptions: { value: string; label: string; category?: string }[] = [];\n    private activeIndicators  = new Set<string>();\n    private volHasData        = true;\n\n    constructor(\n        private onSeriesChange:        (s: SeriesType) => void,\n        private onTimeframeChange:     (tf: Timeframe) => void,\n        private onAddIndicator:        (name: string) => void,\n        private onDurationChange:      (d: Duration, tf: Timeframe) => void,\n        private onSettingsClick:       () => void,\n        private onFullscreenToggle:    () => void,\n        private onDrawingToolsToggle:  (() => void) | null,\n        showDrawingToolsBtn:  boolean,\n        showSettingsBtn:      boolean,\n        showFullscreenBtn:    boolean,\n        showTfcBtn:           boolean,\n        initialTfcActive:     boolean,\n        private onTfcToggle:  ((enabled: boolean) => void) | null,\n        initialSeries:    SeriesType,\n        initialTf:        Timeframe,\n        initialDuration:  Duration | null,\n        durationMap:      Record<Duration, Timeframe>,\n        theme:            ChartTheme,\n        cfg:              TopBarUiConfig = DEFAULT_TOP_BAR_CONFIG,\n        labels:           TopBarLabels   = DEFAULT_LABELS.topBar,\n        private onDropdownChange: (() => void) | null = null,\n    ) {\n        this.theme          = theme;\n        this.cfg            = cfg;\n        this.labels         = labels;\n        this.tfcActive      = initialTfcActive;\n        this.currentSeries  = initialSeries;\n        this.currentTf      = initialTf;\n        this.activeDuration = initialDuration;\n        this.durationMap    = durationMap;\n\n        injectFlyoutScrollbarStyles();\n\n        this.el = document.createElement('div');\n        this.applyBarStyles(theme);\n\n        // ── Flyout (shared for all dropdowns) ─────────────────────────────────\n        this.flyout = document.createElement('div');\n        this.flyout.classList.add('finchart-flyout');\n        this.applyFlyoutStyles();\n        document.body.appendChild(this.flyout);\n        this.disposeFlyoutKbd = observeKeyboardTransform(this.flyout);\n\n        // ── Left group: dropdowns ─────────────────────────────────────────────\n        this.leftGroup = document.createElement('div');\n        Object.assign(this.leftGroup.style, {\n            display:    'flex',\n            alignItems: 'center',\n            gap:        '4px',\n            flex:       '1',\n            minWidth:   '0',\n            overflow:   'hidden',\n        });\n\n        if (showDrawingToolsBtn) {\n            this.drawingBtn = this.makeDrawingBtn(theme);\n            this.leftGroup.appendChild(this.drawingBtn);\n        }\n\n        this.seriesBtn = this.makeSeriesBtn(initialSeries, theme);\n        this.seriesBtn.addEventListener('click', (e) => {\n            e.stopPropagation();\n            this.toggleDropdown('series', this.seriesBtn);\n        });\n        this.addBtnHover(this.seriesBtn);\n\n        this.tfBtn = this.makeDropBtn(initialTf, theme, false);\n        this.tfBtn.addEventListener('click', (e) => {\n            e.stopPropagation();\n            this.toggleDropdown('timeframe', this.tfBtn);\n        });\n        this.addBtnHover(this.tfBtn);\n\n        this.indBtn = this.makeDropBtn(this.labels.indicatorsBtn, theme, false);\n        this.indBtn.addEventListener('click', (e) => {\n            e.stopPropagation();\n            this.toggleDropdown('indicators', this.indBtn);\n        });\n        this.addBtnHover(this.indBtn);\n\n        this.leftGroup.append(this.seriesBtn, this.tfBtn, this.indBtn);\n\n        // ── Right group: duration buttons + fullscreen + settings ──────────────\n        this.rightGroup = document.createElement('div');\n        Object.assign(this.rightGroup.style, {\n            display:    'flex',\n            alignItems: 'center',\n            gap:        '2px',\n            flexShrink: '0',\n        });\n\n        // Duration controls have been moved to BottomBar.\n        // Stub elements are retained so existing setTheme/setMobileLayout/setActiveDuration\n        // calls remain no-ops without needing null guards.\n        this.durationDropBtn = this.makeDropBtn(initialDuration ?? DURATIONS[0], theme, false);\n        this.durationDropBtn.style.display = 'none';\n        this.durationSep = document.createElement('div');\n        this.durationSep.style.display = 'none';\n\n        if (showFullscreenBtn) {\n            this.fullscreenBtn = document.createElement('button');\n            this.fullscreenBtn.title = this.labels.toggleFullscreenTitle;\n            this.fullscreenBtn.innerHTML = ICON_FULLSCREEN_ENTER;\n            this.applyIconBtnStyles(this.fullscreenBtn, theme, false);\n            this.fullscreenBtn.addEventListener('click', (e) => {\n                e.stopPropagation();\n                this.onFullscreenToggle();\n            });\n            this.addBtnHover(this.fullscreenBtn);\n            this.rightGroup.appendChild(this.fullscreenBtn);\n        }\n\n        if (showSettingsBtn) {\n            this.settingsBtn = document.createElement('button');\n            this.settingsBtn.title = this.labels.settingsTitle;\n            this.settingsBtn.innerHTML = ICON_SETTINGS;\n            this.applyIconBtnStyles(this.settingsBtn, theme, false);\n            this.settingsBtn.addEventListener('click', (e) => {\n                e.stopPropagation();\n                this.onSettingsClick();\n            });\n            this.addBtnHover(this.settingsBtn);\n            this.rightGroup.appendChild(this.settingsBtn);\n        }\n\n        if (showTfcBtn) {\n            this.tfcBtn = document.createElement('button');\n            this.tfcBtn.title = this.labels.tfcToggleTitle;\n            this.tfcBtn.innerHTML = this.tfcActive ? ICON_TFC : ICON_TFC_OFF;\n            this.applyIconBtnStyles(this.tfcBtn, theme, this.tfcActive);\n            this.tfcBtn.addEventListener('click', (e) => {\n                e.stopPropagation();\n                this.tfcActive = !this.tfcActive;\n                this.tfcBtn!.innerHTML = this.tfcActive ? ICON_TFC : ICON_TFC_OFF;\n                this.applyIconBtnStyles(this.tfcBtn!, this.theme, this.tfcActive);\n                this.onTfcToggle?.(this.tfcActive);\n            });\n            this.addBtnHover(this.tfcBtn);\n            this.rightGroup.appendChild(this.tfcBtn);\n        }\n\n        this.el.append(this.leftGroup, this.rightGroup);\n\n        // ── Close flyout on outside click ─────────────────────────────────────\n        this.docClickHandler = (e: MouseEvent) => {\n            if (\n                !this.el.contains(e.target as Node) &&\n                !this.flyout.contains(e.target as Node)\n            ) {\n                this.closeDropdown();\n            }\n        };\n        document.addEventListener('click', this.docClickHandler, true);\n    }\n\n    // ── Public API ────────────────────────────────────────────────────────────\n\n    destroy(): void {\n        this.disposeFlyoutKbd();\n        this.flyout.remove();\n        document.removeEventListener('click', this.docClickHandler, true);\n    }\n\n    reparentFlyout(root: HTMLElement): void {\n        if (this.flyout.parentElement !== root) root.appendChild(this.flyout);\n    }\n\n    setFullscreen(active: boolean): void {\n        this.isFullscreen = active;\n        if (!this.fullscreenBtn) return;\n        this.fullscreenBtn.innerHTML = active ? ICON_FULLSCREEN_EXIT : ICON_FULLSCREEN_ENTER;\n        this.fullscreenBtn.title = active ? this.labels.exitFullscreenTitle : this.labels.toggleFullscreenTitle;\n        this.applyIconBtnStyles(this.fullscreenBtn, this.theme, active);\n        // innerHTML reset clobbers mobile SVG sizing — reapply if needed.\n        if (this.isMobileLayout) {\n            this.resizeSvg(this.fullscreenBtn, this.getSvgSize(this.fullscreenBtn) + 2);\n        }\n    }\n\n    setDrawingsBtnActive(active: boolean): void {\n        if (!this.drawingBtn) return;\n        this.applyIconBtnStyles(this.drawingBtn, this.theme, active);\n    }\n\n    setTfcActive(active: boolean): void {\n        if (!this.tfcBtn) return;\n        this.tfcActive = active;\n        this.tfcBtn.innerHTML = active ? ICON_TFC : ICON_TFC_OFF;\n        this.applyIconBtnStyles(this.tfcBtn, this.theme, active);\n        if (this.isMobileLayout) {\n            this.resizeSvg(this.tfcBtn, this.getSvgSize(this.tfcBtn) + 2);\n        }\n    }\n\n    setTheme(theme: ChartTheme): void {\n        this.theme = theme;\n        this.closeDropdown();\n        this.applyBarStyles(theme);\n        this.applyFlyoutStyles();\n        if (this.drawingBtn) this.applyIconBtnStyles(this.drawingBtn, theme, false);\n        if (this.fullscreenBtn) this.applyIconBtnStyles(this.fullscreenBtn, theme, this.isFullscreen);\n        if (this.settingsBtn) this.applyIconBtnStyles(this.settingsBtn, theme, false);\n        if (this.tfcBtn) this.applyIconBtnStyles(this.tfcBtn, theme, this.tfcActive);\n        this.applySeriesBtnStyles(this.seriesBtn, theme, false);\n        this.applyDropBtnStyles(this.tfBtn, theme, false);\n        this.applyDropBtnStyles(this.indBtn, theme, false);\n        for (const [d, btn] of this.durationBtns) {\n            this.applyDurationBtnStyles(btn, theme, d === this.activeDuration);\n        }\n        this.durationSep.style.background = theme.axisBorder;\n        this.applyDropBtnStyles(this.durationDropBtn, theme, false);\n    }\n\n    setSeries(s: SeriesType): void {\n        this.currentSeries = s;\n        this.updateSeriesBtnContent(this.seriesBtn, s);\n    }\n\n    setTimeframe(tf: Timeframe): void {\n        this.currentTf = tf;\n        this.tfBtn.textContent = tf;\n    }\n\n    setActiveDuration(d: Duration | null | undefined): void {\n        if (this.activeDuration === (d ?? null)) return;\n        if (this.activeDuration) {\n            const prev = this.durationBtns.get(this.activeDuration);\n            if (prev) this.applyDurationBtnStyles(prev, this.theme, false);\n        }\n        this.activeDuration = d ?? null;\n        if (d) {\n            const next = this.durationBtns.get(d);\n            if (next) this.applyDurationBtnStyles(next, this.theme, true);\n            this.durationDropBtn.textContent = d;\n        }\n    }\n\n    setMobileLayout(isMobile: boolean): void {\n        if (this.isMobileLayout === isMobile) return;\n        this.isMobileLayout = isMobile;\n        const btnDisplay = isMobile ? 'none' : '';\n        for (const btn of this.durationBtns.values()) {\n            btn.style.display = btnDisplay;\n        }\n        this.durationSep.style.display = btnDisplay;\n        this.durationDropBtn.style.display = isMobile ? '' : 'none';\n\n        // Resize icon button containers to mobile/desktop size.\n        const containerSize = isMobile ? this.cfg.mobileIconBtnSize : this.cfg.iconBtnSize;\n        for (const btn of [this.fullscreenBtn, this.settingsBtn, this.drawingBtn, this.tfcBtn]) {\n            if (!btn) continue;\n            btn.style.width = containerSize;\n            btn.style.height = containerSize;\n        }\n\n        // Resize SVG icons: +2px on mobile for fullscreen/settings (derived from\n        // current desktop size — no standalone desktop config exists for these).\n        const delta = isMobile ? 2 : -2;\n        if (this.fullscreenBtn) {\n            this.resizeSvg(this.fullscreenBtn, this.getSvgSize(this.fullscreenBtn) + delta);\n        }\n        if (this.settingsBtn) {\n            this.resizeSvg(this.settingsBtn, this.getSvgSize(this.settingsBtn) + delta);\n        }\n        if (this.tfcBtn) {\n            this.resizeSvg(this.tfcBtn, this.getSvgSize(this.tfcBtn) + delta);\n        }\n\n        // Drawing toggle uses explicit config values so consumers can override.\n        if (this.drawingBtn) {\n            const drawIconSize = isMobile\n                ? parseInt(this.cfg.mobileDrawBtnIconSize, 10)\n                : parseInt(this.cfg.drawBtnIconFontSize, 10);\n            this.resizeSvg(this.drawingBtn, drawIconSize);\n        }\n    }\n\n    setIndicatorOptions(options: { value: string; label: string; category?: string }[]): void {\n        this.indicatorOptions = options;\n    }\n\n    setIndicatorOptionActive(value: string, active: boolean): void {\n        if (active) {\n            this.activeIndicators.add(value);\n        } else {\n            this.activeIndicators.delete(value);\n        }\n        this.updateIndBtnLabel();\n    }\n\n    /** Update volume control state — reflects VOL as active/inactive in the indicators flyout. */\n    setVolumeControl(show: boolean, hasData: boolean): void {\n        this.volHasData = hasData;\n        const active = hasData && show;\n        if (active) {\n            this.activeIndicators.add('VOL');\n        } else {\n            this.activeIndicators.delete('VOL');\n        }\n        this.updateIndBtnLabel();\n    }\n\n    // ── Private – drawing tools button ───────────────────────────────────────\n\n    private makeDrawingBtn(theme: ChartTheme): HTMLButtonElement {\n        const btn = document.createElement('button');\n        btn.title = 'Drawing Tools';\n        btn.innerHTML = ICON_PENCIL;\n        this.applyIconBtnStyles(btn, theme, false);\n        btn.addEventListener('click', (e) => {\n            e.stopPropagation();\n            this.onDrawingToolsToggle?.();\n        });\n        this.addBtnHover(btn);\n        return btn;\n    }\n\n    // ── Private – series button ────────────────────────────────────────────────\n\n    private makeSeriesBtn(series: SeriesType, theme: ChartTheme): HTMLButtonElement {\n        const btn = document.createElement('button');\n        this.applySeriesBtnStyles(btn, theme, false);\n        this.updateSeriesBtnContent(btn, series);\n        return btn;\n    }\n\n    private updateSeriesBtnContent(btn: HTMLButtonElement, series: SeriesType): void {\n        const label = (this.labels.series as Record<string, string>)[series] ?? series;\n        btn.title = label;\n        btn.innerHTML = ICON_SERIES[series];\n    }\n\n    private applySeriesBtnStyles(btn: HTMLButtonElement, theme: ChartTheme, active: boolean): void {\n        btn.dataset.active = String(active);\n        Object.assign(btn.style, {\n            background:     active ? theme.ui.accentBg : 'transparent',\n            color:          active ? theme.ui.accentText : theme.topBar.btnColor,\n            border:         `1px solid ${active ? theme.ui.accent : theme.axisBorder}`,\n            borderRadius:   '5px',\n            padding:        '3px 7px',\n            cursor:         'pointer',\n            outline:        'none',\n            display:        'flex',\n            alignItems:     'center',\n            gap:            '4px',\n            flexShrink:     '0',\n            height:         '24px',\n            transition:     'border-color 0.12s, background 0.12s',\n        });\n    }\n\n    // ── Private – flyout ──────────────────────────────────────────────────────\n\n    private applyFlyoutStyles(): void {\n        Object.assign(this.flyout.style, {\n            position:     'fixed',\n            zIndex:       '9999',\n            display:      'none',\n            background:   this.theme.tooltip.background,\n            border:       `1px solid ${this.theme.axisBorder}`,\n            borderRadius: '8px',\n            padding:      '4px 0',\n            minWidth:     '168px',\n            maxHeight:    '340px',\n            overflowY:    'auto',\n            overflowX:    'hidden',\n            boxShadow:    '0 8px 24px rgba(0,0,0,0.55), 0 2px 8px rgba(0,0,0,0.3)',\n            fontFamily:   this.cfg.flyoutRowFontFamily,\n            fontSize:     this.cfg.flyoutRowFontSize,\n            scrollbarWidth: 'thin',\n            scrollbarColor: `rgba(120,130,150,0.35) transparent`,\n        });\n    }\n\n    private toggleDropdown(id: DropdownId, anchorBtn: HTMLButtonElement): void {\n        if (this.openDropdown === id) {\n            this.closeDropdown();\n            return;\n        }\n\n        const wasOpen = this.openDropdown !== null;\n        this.openDropdown = id;\n        this.applySeriesBtnStyles(this.seriesBtn,    this.theme, id === 'series');\n        this.applyDropBtnStyles(this.tfBtn,          this.theme, id === 'timeframe');\n        this.applyDropBtnStyles(this.indBtn,         this.theme, id === 'indicators');\n        this.applyDropBtnStyles(this.durationDropBtn, this.theme, id === 'duration');\n\n        this.buildDropdownContent(id);\n\n        const rect = anchorBtn.getBoundingClientRect();\n        Object.assign(this.flyout.style, {\n            display: 'block',\n            left:    `${rect.left}px`,\n            top:     `${rect.bottom + 6}px`,\n        });\n\n        requestAnimationFrame(() => {\n            const fr = this.flyout.getBoundingClientRect();\n            if (fr.right > window.innerWidth - 8) {\n                this.flyout.style.left = `${window.innerWidth - fr.width - 8}px`;\n            }\n            if (fr.bottom > window.innerHeight - 8) {\n                this.flyout.style.top = `${rect.top - fr.height - 6}px`;\n            }\n        });\n\n        if (!wasOpen) this.onDropdownChange?.();\n    }\n\n    private buildDropdownContent(id: DropdownId): void {\n        this.flyout.innerHTML = '';\n        this.flyout.style.minWidth = id === 'series' ? '152px' : id === 'timeframe' ? '160px' : id === 'duration' ? '120px' : '180px';\n\n        if (id === 'series') {\n            const seriesOptions: { value: SeriesType; label: string }[] = [\n                { value: 'candlestick',   label: this.labels.series.candlestick },\n                { value: 'hollow',        label: this.labels.series.hollow },\n                { value: 'ohlc',          label: this.labels.series.ohlc },\n                { value: 'line',          label: this.labels.series.line },\n                { value: 'area',          label: this.labels.series.area },\n                { value: 'heikinashi',    label: this.labels.series.heikinashi },\n                { value: 'volumecandles', label: this.labels.series.volumecandles },\n                { value: 'linemarkers',   label: this.labels.series.linemarkers },\n                { value: 'step',          label: this.labels.series.step },\n                { value: 'hlcarea',       label: this.labels.series.hlcarea },\n                { value: 'baseline',      label: this.labels.series.baseline },\n                { value: 'columns',       label: this.labels.series.columns },\n                { value: 'highlow',       label: this.labels.series.highlow },\n            ];\n            for (const opt of seriesOptions) {\n                const row = this.makeRow(opt.label, opt.value === this.currentSeries, false, ICON_SERIES[opt.value]);\n                row.addEventListener('click', () => {\n                    this.currentSeries = opt.value;\n                    this.updateSeriesBtnContent(this.seriesBtn, opt.value);\n                    this.onSeriesChange(opt.value);\n                    this.closeDropdown();\n                });\n                this.flyout.appendChild(row);\n            }\n        } else if (id === 'timeframe') {\n            const intraday: Timeframe[] = ['1m', '5m', '15m', '30m', '1h', '2h', '4h', '8h'];\n            const daily: Timeframe[]    = ['1D', '1W', '1M'];\n\n            this.flyout.appendChild(this.makeCategoryHeader('Intraday'));\n            for (const tf of intraday) {\n                const tfLabel = this.labels.timeframes[tf] ?? tf;\n                const row = this.makeRow(tfLabel, tf === this.currentTf, false);\n                row.addEventListener('click', () => {\n                    this.currentTf = tf;\n                    this.tfBtn.textContent = tfLabel;\n                    this.onTimeframeChange(tf as Timeframe);\n                    this.closeDropdown();\n                });\n                this.flyout.appendChild(row);\n            }\n            this.flyout.appendChild(this.makeCategoryHeader('Daily +'));\n            for (const tf of daily) {\n                const tfLabel = this.labels.timeframes[tf] ?? tf;\n                const row = this.makeRow(tfLabel, tf === this.currentTf, false);\n                row.addEventListener('click', () => {\n                    this.currentTf = tf;\n                    this.tfBtn.textContent = tfLabel;\n                    this.onTimeframeChange(tf as Timeframe);\n                    this.closeDropdown();\n                });\n                this.flyout.appendChild(row);\n            }\n        } else if (id === 'duration') {\n            for (const d of DURATIONS) {\n                const row = this.makeRow(d, d === this.activeDuration, false);\n                row.addEventListener('click', () => {\n                    this.setActiveDuration(d);\n                    this.onDurationChange(d, this.durationMap[d]);\n                    this.closeDropdown();\n                });\n                this.flyout.appendChild(row);\n            }\n        } else {\n            // ── Search input ──────────────────────────────────────────────────\n            const searchWrap = document.createElement('div');\n            Object.assign(searchWrap.style, {\n                position:   'sticky',\n                top:        '0',\n                zIndex:     '1',\n                padding:    '6px 8px',\n                background: this.theme.tooltip.background,\n                borderBottom: `1px solid ${this.theme.axisBorder}`,\n            });\n\n            const searchInput = document.createElement('input');\n            searchInput.type        = 'text';\n            searchInput.placeholder = 'Search indicators…';\n            Object.assign(searchInput.style, {\n                width:        '100%',\n                boxSizing:    'border-box',\n                padding:      '5px 8px',\n                background:   this.theme.background,\n                color:        this.theme.tooltip.text,\n                border:       `1px solid ${this.theme.axisBorder}`,\n                borderRadius: '4px',\n                // iOS Safari auto-zooms on focus for inputs <16px without\n                // restoring the zoom — keep at 16px to disable that.\n                fontSize:     '16px',\n                outline:      'none',\n            });\n            searchWrap.appendChild(searchInput);\n            this.flyout.appendChild(searchWrap);\n\n            // ── Scrollable list container ─────────────────────────────────────\n            const listContainer = document.createElement('div');\n            this.flyout.appendChild(listContainer);\n\n            // Build grouped structure once\n            const groups = new Map<string, { value: string; label: string }[]>();\n            for (const o of this.indicatorOptions) {\n                const cat = o.category ?? '';\n                if (!groups.has(cat)) groups.set(cat, []);\n                groups.get(cat)!.push(o);\n            }\n\n            const renderList = (query: string) => {\n                listContainer.innerHTML = '';\n                const q = query.trim().toLowerCase();\n\n                if (q) {\n                    // Flat filtered results, no category headers\n                    for (const o of this.indicatorOptions) {\n                        if (!o.label.toLowerCase().includes(q) && !o.value.toLowerCase().includes(q)) continue;\n                        const isActive   = this.activeIndicators.has(o.value);\n                        const isDisabled = VOLUME_REQUIRED.has(o.value) && !this.volHasData;\n                        const row = this.makeRow(o.label, isActive, isDisabled);\n                        if (!isDisabled) {\n                            row.addEventListener('click', () => {\n                                this.onAddIndicator(o.value);\n                                renderList(searchInput.value);\n                            });\n                        }\n                        listContainer.appendChild(row);\n                    }\n                } else {\n                    // Grouped view\n                    for (const [cat, entries] of groups) {\n                        if (cat) listContainer.appendChild(this.makeCategoryHeader(cat));\n                        for (const o of entries) {\n                            const isActive   = this.activeIndicators.has(o.value);\n                            const isDisabled = VOLUME_REQUIRED.has(o.value) && !this.volHasData;\n                            const row = this.makeRow(o.label, isActive, isDisabled);\n                            if (!isDisabled) {\n                                row.addEventListener('click', () => {\n                                    this.onAddIndicator(o.value);\n                                    renderList(searchInput.value);\n                                });\n                            }\n                            listContainer.appendChild(row);\n                        }\n                    }\n                }\n            };\n\n            renderList('');\n            searchInput.addEventListener('input', () => renderList(searchInput.value));\n\n            // Auto-focus search after layout\n            requestAnimationFrame(() => searchInput.focus({ preventScroll: true }));\n        }\n    }\n\n    private makeCategoryHeader(label: string): HTMLDivElement {\n        const header = document.createElement('div');\n        Object.assign(header.style, {\n            padding:       '6px 12px 4px',\n            fontSize:      this.cfg.flyoutCategoryFontSize,\n            fontWeight:    '600',\n            letterSpacing: this.cfg.flyoutCategoryLetterSpacing,\n            color:         this.theme.topBar.flyoutCategoryColor,\n            textTransform: 'uppercase',\n            opacity:       '0.55',\n            marginTop:     '2px',\n        });\n        header.textContent = label;\n        return header;\n    }\n\n    private makeRow(\n        label: string,\n        active: boolean,\n        disabled: boolean,\n        iconHtml?: string,\n    ): HTMLButtonElement {\n        const row = document.createElement('button');\n        const hoverBg = this.theme.ui.accentBg;\n        const activeBg = this.theme.ui.accentBg;\n\n        Object.assign(row.style, {\n            width:      '100%',\n            padding:    '7px 12px',\n            background: active ? activeBg : 'transparent',\n            border:     'none',\n            borderLeft: active\n                            ? `2px solid ${this.theme.ui.accent}`\n                            : '2px solid transparent',\n            color:      disabled\n                            ? this.theme.ui.disabledText\n                            : active\n                                ? this.theme.ui.accentText\n                                : this.theme.topBar.flyoutRowColor,\n            fontSize:   this.cfg.flyoutRowFontSize,\n            fontFamily: this.cfg.flyoutRowFontFamily,\n            textAlign:  'left',\n            cursor:     disabled ? 'not-allowed' : 'pointer',\n            display:    'flex',\n            alignItems: 'center',\n            gap:        '8px',\n            boxSizing:  'border-box',\n            opacity:    disabled ? '0.45' : '1',\n            transition: 'background 0.1s',\n        });\n\n        if (!disabled && !active) {\n            row.addEventListener('mouseenter', () => {\n                row.style.background = hoverBg;\n            });\n            row.addEventListener('mouseleave', () => {\n                row.style.background = 'transparent';\n            });\n        }\n\n        if (iconHtml) {\n            const iconWrap = document.createElement('span');\n            Object.assign(iconWrap.style, {\n                display:    'flex',\n                alignItems: 'center',\n                flexShrink: '0',\n                opacity:    active ? '1' : '0.7',\n            });\n            iconWrap.innerHTML = iconHtml;\n            // resize the svg inside\n            const svg = iconWrap.querySelector('svg');\n            if (svg) {\n                svg.setAttribute('width', '13');\n                svg.setAttribute('height', '13');\n            }\n            row.appendChild(iconWrap);\n        }\n\n        const nameSpan = document.createElement('span');\n        nameSpan.style.flex = '1';\n        nameSpan.textContent = label;\n        row.appendChild(nameSpan);\n\n        if (active) {\n            const check = document.createElement('span');\n            Object.assign(check.style, {\n                color:      this.theme.ui.accent,\n                fontSize:   this.cfg.flyoutCheckFontSize,\n                flexShrink: '0',\n            });\n            check.innerHTML = ICON_CHECKMARK;\n            row.appendChild(check);\n        }\n\n        return row;\n    }\n\n    /** Closes any open dropdown flyout. Public so hosts can dismiss from back-button handlers. */\n    closeDropdown(): void {\n        const wasOpen = this.openDropdown !== null;\n        this.flyout.style.display = 'none';\n        this.openDropdown = null;\n        this.applySeriesBtnStyles(this.seriesBtn,     this.theme, false);\n        this.applyDropBtnStyles(this.tfBtn,           this.theme, false);\n        this.applyDropBtnStyles(this.indBtn,          this.theme, false);\n        this.applyDropBtnStyles(this.durationDropBtn, this.theme, false);\n        if (wasOpen) this.onDropdownChange?.();\n    }\n\n    /** True when any of the topbar dropdowns (series, timeframe, indicators, duration) is open. */\n    get hasOpenDropdown(): boolean {\n        return this.openDropdown !== null;\n    }\n\n    private updateIndBtnLabel(): void {\n        const count = this.activeIndicators.size;\n        this.indBtn.textContent = count > 0\n            ? this.labels.indicatorsBtnActive.replace('{count}', String(count))\n            : this.labels.indicatorsBtn;\n    }\n\n    // ── Private helpers ───────────────────────────────────────────────────────\n\n    private addBtnHover(btn: HTMLButtonElement): void {\n        btn.addEventListener('mouseenter', () => {\n            if (btn.dataset.active !== 'true') btn.style.background = this.theme.ui.accentBg;\n        });\n        btn.addEventListener('mouseleave', () => {\n            if (btn.dataset.active !== 'true') btn.style.background = 'transparent';\n        });\n    }\n\n    private applyBarStyles(theme: ChartTheme): void {\n        Object.assign(this.el.style, {\n            display:      'flex',\n            alignItems:   'center',\n            gap:          '8px',\n            height:       this.cfg.height,\n            padding:      '0 10px',\n            background:   theme.background,\n            borderBottom: `1px solid ${theme.axisBorder}`,\n            boxSizing:    'border-box',\n            flexShrink:   '0',\n        });\n    }\n\n    private makeDropBtn(label: string, theme: ChartTheme, active: boolean): HTMLButtonElement {\n        const btn = document.createElement('button');\n        btn.textContent = label;\n        this.applyDropBtnStyles(btn, theme, active);\n        return btn;\n    }\n\n    private applyDropBtnStyles(btn: HTMLButtonElement, theme: ChartTheme, active: boolean): void {\n        btn.dataset.active = String(active);\n        Object.assign(btn.style, {\n            background:   active ? theme.ui.accentBg : 'transparent',\n            color:        active ? theme.ui.accentText : theme.topBar.btnColor,\n            border:       `1px solid ${active ? theme.ui.accent : theme.axisBorder}`,\n            borderRadius: '5px',\n            padding:      '3px 8px',\n            height:       '24px',\n            fontSize:     this.cfg.dropBtnFontSize,\n            fontFamily:   this.cfg.dropBtnFontFamily,\n            cursor:       'pointer',\n            outline:      'none',\n            whiteSpace:   'nowrap',\n            transition:   'border-color 0.12s, background 0.12s',\n        });\n    }\n\n    private applyDurationBtnStyles(btn: HTMLButtonElement, theme: ChartTheme, active: boolean): void {\n        btn.dataset.active = String(active);\n        Object.assign(btn.style, {\n            background:   active ? theme.bottomBar.activeBtnBg   : 'transparent',\n            color:        active ? theme.bottomBar.activeBtnText  : theme.bottomBar.btnColor,\n            border:       `1px solid ${active ? theme.bottomBar.activeBtnBorder : 'transparent'}`,\n            borderRadius: '4px',\n            padding:      '2px 7px',\n            fontSize:     this.cfg.dropBtnFontSize,\n            fontFamily:   this.cfg.dropBtnFontFamily,\n            cursor:       'pointer',\n            outline:      'none',\n            transition:   'background 0.15s, color 0.15s',\n            whiteSpace:   'nowrap',\n        });\n    }\n\n    private applyIconBtnStyles(btn: HTMLButtonElement, theme: ChartTheme, active: boolean): void {\n        btn.dataset.active = String(active);\n        const size = this.isMobileLayout ? this.cfg.mobileIconBtnSize : this.cfg.iconBtnSize;\n        Object.assign(btn.style, {\n            background:     active ? theme.ui.accentBg : 'transparent',\n            color:          active ? theme.ui.accentText : theme.topBar.btnColor,\n            border:         `1px solid ${active ? theme.ui.accent : theme.axisBorder}`,\n            borderRadius:   '5px',\n            width:          size,\n            height:         size,\n            cursor:         'pointer',\n            outline:        'none',\n            display:        'flex',\n            alignItems:     'center',\n            justifyContent: 'center',\n            padding:        '0',\n            flexShrink:     '0',\n            transition:     'border-color 0.12s, background 0.12s',\n        });\n    }\n\n    private resizeSvg(btn: HTMLButtonElement | null, size: number): void {\n        if (!btn) return;\n        const svg = btn.querySelector('svg');\n        if (svg) {\n            svg.setAttribute('width', String(size));\n            svg.setAttribute('height', String(size));\n        }\n    }\n\n    private getSvgSize(btn: HTMLButtonElement | null): number {\n        if (!btn) return 0;\n        const svg = btn.querySelector('svg');\n        if (!svg) return 0;\n        return parseInt(svg.getAttribute('width') ?? '0', 10);\n    }\n}\n","import type { Duration, Timeframe } from '../core/types.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { DEFAULT_BOTTOM_BAR_CONFIG, type BottomBarUiConfig } from '../core/uiConfig.js';\nimport { DEFAULT_LABELS, type BottomBarLabels } from '../core/labels.js';\n\nexport const DURATION_TIMEFRAME_MAP: Record<Duration, Timeframe> = {\n    '1D': '5m',\n    '5D': '15m',\n    '1M': '30m',\n    '3M': '30m',\n    '6M': '1D',\n    '1Y': '1D',\n    '5Y': '1W',\n    All: '1M',\n};\n\nconst DURATIONS: Duration[] = ['1D', '5D', '1M', '3M', '6M', '1Y', '5Y', 'All'];\n\nexport class BottomBar {\n    readonly el: HTMLDivElement;\n    private buttons = new Map<Duration, HTMLButtonElement>();\n    private activeDuration: Duration | null;\n    private theme: ChartTheme;\n    private cfg: BottomBarUiConfig;\n    private labels: BottomBarLabels;\n    private map: Record<Duration, Timeframe>;\n\n    constructor(\n        private onDurationChange: (d: Duration, tf: Timeframe) => void,\n        initialDuration: Duration | null,\n        theme: ChartTheme,\n        customMap?: Partial<Record<Duration, Timeframe>>,\n        cfg: BottomBarUiConfig = DEFAULT_BOTTOM_BAR_CONFIG,\n        labels: BottomBarLabels = DEFAULT_LABELS.bottomBar\n    ) {\n        this.activeDuration = initialDuration;\n        this.theme = theme;\n        this.cfg = cfg;\n        this.labels = labels;\n        this.map = { ...DURATION_TIMEFRAME_MAP, ...customMap };\n\n        this.el = document.createElement('div');\n        this.applyBarStyles(theme);\n\n        for (const d of DURATIONS) {\n            const btn = document.createElement('button');\n            btn.textContent = this.labels.durations[d] ?? d;\n            this.applyButtonStyles(btn, theme, d === initialDuration);\n            btn.addEventListener('click', () => {\n                this.setActive(d);\n                this.onDurationChange(d, this.map[d]);\n            });\n            this.buttons.set(d, btn);\n            this.el.appendChild(btn);\n        }\n    }\n\n    setTheme(theme: ChartTheme): void {\n        this.theme = theme;\n        this.applyBarStyles(theme);\n        for (const [d, btn] of this.buttons) {\n            this.applyButtonStyles(\n                btn,\n                theme,\n                this.activeDuration !== null && d === this.activeDuration\n            );\n        }\n    }\n\n    setActive(d: Duration | null | undefined): void {\n        if (this.activeDuration === (d ?? null)) return;\n        if (this.activeDuration) {\n            const prev = this.buttons.get(this.activeDuration);\n            if (prev) this.applyButtonStyles(prev, this.theme, false);\n        }\n        this.activeDuration = d ?? null;\n        if (d) {\n            const next = this.buttons.get(d);\n            if (next) this.applyButtonStyles(next, this.theme, true);\n        }\n    }\n\n    // ── Private helpers ───────────────────────────────────────────────────────\n\n    private applyBarStyles(theme: ChartTheme): void {\n        Object.assign(this.el.style, {\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'flex-end',\n            gap: '2px',\n            height: this.cfg.height,\n            padding: '0 10px',\n            background: theme.background,\n            borderTop: `1px solid ${theme.axisBorder}`,\n            boxSizing: 'border-box',\n            flexShrink: '0',\n        });\n    }\n\n    private applyButtonStyles(btn: HTMLButtonElement, theme: ChartTheme, active: boolean): void {\n        Object.assign(btn.style, {\n            background: active ? theme.bottomBar.activeBtnBg : 'transparent',\n            color: active ? theme.bottomBar.activeBtnText : theme.bottomBar.btnColor,\n            border: `1px solid ${active ? theme.bottomBar.activeBtnBorder : 'transparent'}`,\n            borderRadius: '3px',\n            padding: '2px 7px',\n            fontSize: this.cfg.btnFontSize,\n            fontFamily: this.cfg.btnFontFamily,\n            cursor: 'pointer',\n            outline: 'none',\n            transition: 'background 0.15s',\n        });\n    }\n}\n","import type { DrawingToolType } from '../core/types.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { DEFAULT_DRAWING_TOOLBAR_CONFIG, type DrawingToolbarUiConfig } from '../core/uiConfig.js';\nimport { DEFAULT_LABELS, type DrawingToolbarLabels } from '../core/labels.js';\nimport { ICON_CAT, ICON_ACTION, ICON_ACTION_TOGGLED, ICON_TOOL, ICON_CHEVRON_UP, ICON_CHEVRON_DOWN, ICON_MORE_ACTIONS } from './icons.js';\n\n// ── Data ──────────────────────────────────────────────────────────────────────\n\nconst IMPLEMENTED: Record<string, DrawingToolType> = {\n    // Trend Lines & Channels\n    horizontal_line:   'horizontalLine',\n    vertical_line:     'verticalLine',\n    trend_line:        'trendLine',\n    trend_angle:       'trendAngle',\n    cross_line:        'crossLine',\n    parallel_channel:  'parallelChannel',\n    disjoint_channel:  'disjointChannel',\n    flat_channel:      'flatChannel',\n    // Fibonacci & Gann\n    fib_retracement:   'fibRetracement',\n    fib_extension:     'fibExtension',\n    fib_channel:       'fibChannel',\n    fib_timezone:      'fibTimezone',\n    fib_circles:       'fibCircles',\n    fib_spiral:        'fibSpiral',\n    fib_fan:           'fibFan',\n    gann_fan:          'gannFan',\n    gann_square:       'gannSquare',\n    gann_box:          'gannBox',\n    // Geometric Shapes\n    rectangle:         'rectangle',\n    rotated_rectangle: 'rotatedRectangle',\n    ellipse:           'ellipse',\n    triangle:          'triangle',\n    circle:            'circle',\n    arc:               'arc',\n    polyline:          'polyline',\n    path:              'path',\n    // Measurement\n    price_range:       'priceRange',\n    date_range:        'dateRange',\n    date_price_range:  'datePriceRange',\n    ruler:             'ruler',\n    // Pitchfork\n    pitchfork:         'pitchfork',\n    schiff_pitchfork:  'schiffPitchfork',\n    modified_schiff:   'modifiedSchiff',\n    inside_pitchfork:  'insidePitchfork',\n    // Volume & Statistical\n    fixed_range_vp:    'fixedRangeVP',\n    anchored_vp:       'anchoredVP',\n    volume_profile:    'volumeProfile',\n    regression_trend:  'regressionTrend',\n    // Annotations\n    text:              'text',\n    callout:           'callout',\n    price_label:       'priceLabel',\n    arrow_marker:      'arrowMarker',\n    flag:              'flag',\n    price_note:        'priceNote',\n    anchored_note:     'anchoredNote',\n    arrow_up:          'arrowUp',\n    arrow_down:        'arrowDown',\n    // Pattern Recognition\n    head_shoulders:    'headShoulders',\n    triangle_pattern:  'trianglePattern',\n    three_drives:      'threeDrives',\n    abcd_pattern:      'abcdPattern',\n    cypher_pattern:    'cypherPattern',\n    butterfly_pattern: 'butterflyPattern',\n    bat_pattern:       'batPattern',\n    gartley_pattern:   'gartleyPattern',\n    crab_pattern:      'crabPattern',\n    shark_pattern:     'sharkPattern',\n    // Elliott Wave\n    elliott_impulse:     'elliottImpulse',\n    elliott_corrective:  'elliottCorrective',\n    elliott_triangle:    'elliottTriangle',\n    elliott_combination: 'elliottCombination',\n    elliott_wxy:         'elliottWxy',\n    // Brush & Highlighter\n    brush:             'brush',\n    highlighter:       'highlighter',\n    // Advanced\n    ghost_feed:        'ghostFeed',\n    projection:        'projection',\n    sine_line:         'sineLine',\n    cyclic_lines:      'cyclicLines',\n    time_cycles:       'timeCycles',\n    // Price Projections\n    fib_projection:    'fibProjection',\n    price_projection:  'priceProjection',\n};\n\ninterface Tool     { id: string; name: string; icon: string; shortcut?: string; }\ninterface Category { id: string; name: string; icon: string; tools: Tool[]; }\n\nconst CATEGORIES: Category[] = [\n    {\n        id: 'trend_lines', name: 'Trend Lines & Channels', icon: '↗',\n        tools: [\n            { id: 'trend_line',       name: 'Trend Line',              icon: '↗', shortcut: 'Alt+T' },\n            { id: 'trend_angle',      name: 'Trend Angle',             icon: '∠' },\n            { id: 'horizontal_line',  name: 'Horizontal Line',         icon: '—', shortcut: 'Alt+H' },\n            { id: 'vertical_line',    name: 'Vertical Line',           icon: '⏐', shortcut: 'Alt+V' },\n            { id: 'cross_line',       name: 'Cross Line',              icon: '✚' },\n            { id: 'parallel_channel', name: 'Parallel Channel',        icon: '⫿' },\n            { id: 'disjoint_channel', name: 'Disjoint Channel',        icon: '≠' },\n            { id: 'flat_channel',     name: 'Flat Top/Bottom Channel', icon: '⊓' },\n        ],\n    },\n    {\n        id: 'fibonacci_gann', name: 'Fibonacci & Gann Tools', icon: 'φ',\n        tools: [\n            { id: 'fib_retracement', name: 'Fibonacci Retracement',         icon: 'φ', shortcut: 'Alt+F' },\n            { id: 'fib_extension',   name: 'Fibonacci Extension',            icon: 'φ' },\n            { id: 'fib_channel',     name: 'Fibonacci Channel',              icon: 'φ' },\n            { id: 'fib_timezone',    name: 'Fibonacci Timezone',             icon: 'φ' },\n            { id: 'fib_circles',     name: 'Fibonacci Circles',              icon: '⊙' },\n            { id: 'fib_spiral',      name: 'Fibonacci Spiral',               icon: '@' },\n            { id: 'fib_fan',         name: 'Fibonacci Speed Resistance Fan', icon: '⌇' },\n            { id: 'gann_fan',        name: 'Gann Fan',                       icon: '⌇' },\n            { id: 'gann_square',     name: 'Gann Square',                    icon: '⊞' },\n            { id: 'gann_box',        name: 'Gann Box',                       icon: '⊡' },\n        ],\n    },\n    {\n        id: 'geometric_shapes', name: 'Geometric Shapes', icon: '▭',\n        tools: [\n            { id: 'rectangle',         name: 'Rectangle',         icon: '▭' },\n            { id: 'rotated_rectangle', name: 'Rotated Rectangle', icon: '◇' },\n            { id: 'ellipse',           name: 'Ellipse',           icon: '⬭' },\n            { id: 'triangle',          name: 'Triangle',          icon: '△' },\n            { id: 'circle',            name: 'Circle',            icon: '○' },\n            { id: 'arc',               name: 'Arc',               icon: '⌒' },\n            { id: 'polyline',          name: 'Polyline',          icon: '⚡' },\n            { id: 'path',              name: 'Path',              icon: '〰' },\n        ],\n    },\n    {\n        id: 'measurement_tools', name: 'Measurement Tools', icon: '⇕',\n        tools: [\n            { id: 'price_range',      name: 'Price Range',        icon: '⇕' },\n            { id: 'date_range',       name: 'Date Range',         icon: '⇔' },\n            { id: 'date_price_range', name: 'Date & Price Range', icon: '⊞' },\n            { id: 'ruler',            name: 'Ruler',              icon: '⊢' },\n        ],\n    },\n    {\n        id: 'pitchfork_tools', name: 'Pitchfork Tools', icon: '⑁',\n        tools: [\n            { id: 'pitchfork',        name: 'Pitchfork',                 icon: '⑁' },\n            { id: 'schiff_pitchfork', name: 'Schiff Pitchfork',          icon: '⑁' },\n            { id: 'modified_schiff',  name: 'Modified Schiff Pitchfork', icon: '⑁' },\n            { id: 'inside_pitchfork', name: 'Inside Pitchfork',          icon: '⑁' },\n        ],\n    },\n    {\n        id: 'volume_statistics', name: 'Volume & Statistical Tools', icon: '▤',\n        tools: [\n            { id: 'fixed_range_vp',   name: 'Fixed Range Volume Profile', icon: '▤' },\n            { id: 'anchored_vp',      name: 'Anchored Volume Profile',    icon: '▤' },\n            { id: 'volume_profile',   name: 'Volume Profile',             icon: '▤' },\n            { id: 'regression_trend', name: 'Regression Trend',           icon: '↗' },\n        ],\n    },\n    {\n        id: 'annotation_tools', name: 'Annotation Tools', icon: 'A',\n        tools: [\n            { id: 'text',          name: 'Text',          icon: 'A' },\n            { id: 'callout',       name: 'Callout',       icon: '⬕' },\n            { id: 'price_label',   name: 'Price Label',   icon: '$' },\n            { id: 'arrow_marker',  name: 'Arrow Marker',  icon: '→' },\n            { id: 'flag',          name: 'Flag',          icon: '⚑' },\n            { id: 'price_note',    name: 'Price Note',    icon: '≡' },\n            { id: 'anchored_note', name: 'Anchored Note', icon: '⊕' },\n            { id: 'arrow_up',      name: 'Arrow Up',      icon: '↑' },\n            { id: 'arrow_down',    name: 'Arrow Down',    icon: '↓' },\n        ],\n    },\n    {\n        id: 'pattern_recognition', name: 'Pattern Recognition', icon: '◬',\n        tools: [\n            { id: 'head_shoulders',    name: 'Head & Shoulders',  icon: '⌢' },\n            { id: 'triangle_pattern',  name: 'Triangle Pattern',  icon: '◬' },\n            { id: 'three_drives',      name: '3 Drives Pattern',  icon: '⋎' },\n            { id: 'abcd_pattern',      name: 'ABCD Pattern',      icon: '⊿' },\n            { id: 'cypher_pattern',    name: 'Cypher Pattern',    icon: 'C' },\n            { id: 'butterfly_pattern', name: 'Butterfly Pattern', icon: '⋈' },\n            { id: 'bat_pattern',       name: 'Bat Pattern',       icon: '⌓' },\n            { id: 'gartley_pattern',   name: 'Gartley Pattern',   icon: 'G' },\n            { id: 'crab_pattern',      name: 'Crab Pattern',      icon: '⊓' },\n            { id: 'shark_pattern',     name: 'Shark Pattern',     icon: '⊳' },\n        ],\n    },\n    {\n        id: 'elliott_wave', name: 'Elliott Wave Tools', icon: '∿',\n        tools: [\n            { id: 'elliott_impulse',     name: 'Elliott Impulse (12345)',    icon: '∿' },\n            { id: 'elliott_corrective',  name: 'Elliott Corrective (ABC)',   icon: '∿' },\n            { id: 'elliott_triangle',    name: 'Elliott Wave Triangle',      icon: '△' },\n            { id: 'elliott_combination', name: 'Elliott Wave Combination',   icon: '∿' },\n            { id: 'elliott_wxy',         name: 'Elliott Double Three (WXY)', icon: '∿' },\n        ],\n    },\n    {\n        id: 'brush_highlighter', name: 'Brush & Highlighter', icon: '∫',\n        tools: [\n            { id: 'brush',       name: 'Brush',       icon: '∫' },\n            { id: 'highlighter', name: 'Highlighter', icon: '▬' },\n        ],\n    },\n    {\n        id: 'advanced_tools', name: 'Advanced Tools', icon: '⊛',\n        tools: [\n            { id: 'ghost_feed',   name: 'Ghost Feed',   icon: '◑' },\n            { id: 'projection',   name: 'Projection',   icon: '→' },\n            { id: 'sine_line',    name: 'Sine Line',    icon: '∿' },\n            { id: 'cyclic_lines', name: 'Cyclic Lines', icon: '⟳' },\n            { id: 'time_cycles',  name: 'Time Cycles',  icon: '⊙' },\n        ],\n    },\n    {\n        id: 'price_projections', name: 'Price Projection Tools', icon: '⊿',\n        tools: [\n            { id: 'fib_projection',   name: 'Fibonacci Projection', icon: 'φ' },\n            { id: 'price_projection', name: 'Price Projection',     icon: '⊿' },\n        ],\n    },\n];\n\nconst ACTIONS = [\n    { id: 'undo',              icon: '↶', title: 'Undo (Ctrl+Z)'         },\n    { id: 'redo',              icon: '↷', title: 'Redo (Ctrl+Y)'         },\n    { id: 'delete_selected',   icon: '✕', title: 'Delete Selected (Del)' },\n    { id: 'clear_all',         icon: '⊡', title: 'Clear All'             },\n    { id: 'toggle_visibility', icon: '◌', title: 'Hide All'              },\n    { id: 'toggle_lock',       icon: '⊠', title: 'Lock All'              },\n];\n\n// ── Class ─────────────────────────────────────────────────────────────────────\n\nexport class LeftBar {\n    readonly el: HTMLDivElement;\n    private flyout: HTMLDivElement;\n    private activeTool: DrawingToolType | null = null;\n    private openCategoryId: string | null = null;\n    private openActionsMenu = false;\n    private theme:  ChartTheme;\n    private cfg:    DrawingToolbarUiConfig;\n    private labels: DrawingToolbarLabels;\n    private catButtons = new Map<string, HTMLButtonElement>();\n    private docClickHandler: (e: MouseEvent) => void;\n    private drawingsHidden = false;\n    private drawingsLocked = false;\n    private toolsArea!: HTMLDivElement;\n    private scrollUpBtn!: HTMLButtonElement;\n    private scrollDownBtn!: HTMLButtonElement;\n    private mobileMode = false;\n    private topSection!: HTMLDivElement;\n    private toolsGrid!: HTMLDivElement;\n    private settingsVisible = true;\n\n    constructor(\n        private onToolChange:   (tool: DrawingToolType | null) => void,\n        private onAction:       (actionId: string) => void,\n        private onMobileClose:  (() => void) | null,\n        theme:   ChartTheme,\n        cfg:     DrawingToolbarUiConfig   = DEFAULT_DRAWING_TOOLBAR_CONFIG,\n        labels:  DrawingToolbarLabels     = DEFAULT_LABELS.drawingToolbar,\n    ) {\n        this.theme  = theme;\n        this.cfg    = cfg;\n        this.labels = labels;\n        this.el     = document.createElement('div');\n        this.flyout = document.createElement('div');\n\n        this.applyBarStyles();\n        this.applyWidth();\n        this.buildToolbar();\n        this.buildFlyout();\n\n        document.body.appendChild(this.flyout);\n\n        this.docClickHandler = (e: MouseEvent) => {\n            if (\n                !this.el.contains(e.target as Node) &&\n                !this.flyout.contains(e.target as Node)\n            ) {\n                this.closeFlyout();\n            }\n        };\n        document.addEventListener('click', this.docClickHandler, true);\n    }\n\n    // ── Public API ────────────────────────────────────────────────────────────\n\n    setTheme(theme: ChartTheme): void {\n        this.theme = theme;\n        this.closeFlyout();\n        this.applyBarStyles();\n        this.applyWidth();\n        this.buildFlyout();\n        this.applyScrollBtnStyles(this.scrollUpBtn, 'up');\n        this.applyScrollBtnStyles(this.scrollDownBtn, 'down');\n\n        // Rebuild action buttons so they pick up the new theme colors\n        this.topSection.innerHTML = '';\n        // Single-column layout for both desktop and mobile: always use the\n        // collapsed \"more actions\" flyout button instead of the desktop grid.\n        this.topSection.appendChild(this.buildMobileActionsBtn());\n\n        for (const [catId, btn] of this.catButtons) {\n            const isActive = this.activeTool !== null &&\n                CATEGORIES.find(c => c.id === catId)\n                    ?.tools.some(t => IMPLEMENTED[t.id] === this.activeTool) === true;\n            this.applyCatBtnStyles(btn, isActive);\n        }\n    }\n\n    setActiveTool(tool: DrawingToolType | null): void {\n        if (this.activeTool !== null) {\n            const prev = CATEGORIES.find(c => c.tools.some(t => IMPLEMENTED[t.id] === this.activeTool));\n            if (prev) this.applyCatBtnStyles(this.catButtons.get(prev.id)!, false);\n        }\n        this.activeTool = tool;\n        if (tool !== null) {\n            const next = CATEGORIES.find(c => c.tools.some(t => IMPLEMENTED[t.id] === tool));\n            if (next) this.applyCatBtnStyles(this.catButtons.get(next.id)!, true);\n        }\n    }\n\n    setVisible(visible: boolean): void {\n        this.settingsVisible = visible;\n        this.applyWidth();\n    }\n\n    /**\n     * Switch between desktop (2-column) and mobile (1-column + overlay) layouts.\n     * Called automatically by ChartEngine when the container crosses the\n     * `mobileBreakpoint` threshold.\n     */\n    setMobileMode(enabled: boolean): void {\n        if (this.mobileMode === enabled) return;\n        this.mobileMode = enabled;\n        this.closeFlyout();\n\n        // Rebuild actions section\n        this.topSection.innerHTML = '';\n        // Single-column layout for both desktop and mobile: always use the\n        // collapsed \"more actions\" flyout button instead of the desktop grid.\n        this.topSection.appendChild(this.buildMobileActionsBtn());\n\n        // Rebuild category grid with new column count\n        this.catButtons.clear();\n        const newGrid = this.makeGrid();\n        this.populateCategoryGrid(newGrid);\n        this.toolsGrid.replaceWith(newGrid);\n        this.toolsGrid = newGrid;\n        // Reapply active tool highlight on new buttons\n        if (this.activeTool !== null) {\n            const activeCat = CATEGORIES.find(c => c.tools.some(t => IMPLEMENTED[t.id] === this.activeTool));\n            if (activeCat) {\n                const catBtn = this.catButtons.get(activeCat.id);\n                if (catBtn) this.applyCatBtnStyles(catBtn, true);\n            }\n        }\n\n        if (enabled) {\n            // Mobile: overlay mode — float above the canvas, hidden by default\n            Object.assign(this.el.style, {\n                position: 'absolute',\n                left:     '0',\n                top:      '0',\n                height:   '100%',\n                zIndex:   '50',\n            });\n            this.settingsVisible = false;\n        } else {\n            // Desktop: normal flex item\n            Object.assign(this.el.style, {\n                position: '',\n                left:     '',\n                top:      '',\n                height:   '',\n                zIndex:   '',\n            });\n            this.settingsVisible = true;\n        }\n\n        // Update bar width\n        this.applyBarStyles();\n        this.applyWidth();\n\n        requestAnimationFrame(() => this.updateScrollIndicators());\n    }\n\n    reparentFlyout(root: HTMLElement): void {\n        if (this.flyout.parentElement !== root) root.appendChild(this.flyout);\n    }\n\n    destroy(): void {\n        this.flyout.remove();\n        document.removeEventListener('click', this.docClickHandler, true);\n    }\n\n    // ── Private – layout builders ─────────────────────────────────────────────\n\n    private get barWidth(): number {\n        return this.cfg.barPadding * 2 + this.cfg.iconBtnSize;\n    }\n\n    private applyBarStyles(): void {\n        Object.assign(this.el.style, {\n            display:       'flex',\n            flexDirection: 'column',\n            flexShrink:    '0',\n            position:      'relative',\n            height:        '100%',\n            background:    this.theme.background,\n            borderRight:   `1px solid ${this.theme.axisBorder}`,\n            boxSizing:     'border-box',\n            userSelect:    'none',\n            fontFamily:    this.cfg.flyoutLabelFontFamily,\n            overflow:      'hidden',\n            transition:    'width 0.2s ease',\n        });\n    }\n\n    private applyWidth(): void {\n        if (!this.settingsVisible) {\n            this.el.style.width = '0';\n        } else {\n            this.el.style.width = `${this.barWidth}px`;\n        }\n    }\n\n    private buildToolbar(): void {\n        // ── Actions at top ────────────────────────────────────────────────────\n        this.topSection = document.createElement('div');\n        Object.assign(this.topSection.style, {\n            borderBottom: `1px solid ${this.theme.axisBorder}`,\n            padding:      `10px ${this.cfg.barPadding}px 10px`,\n            boxSizing:    'border-box',\n            flexShrink:   '0',\n        });\n        // Single-column layout for both desktop and mobile: always use the\n        // collapsed \"more actions\" flyout button instead of the desktop grid.\n        this.topSection.appendChild(this.buildMobileActionsBtn());\n        this.el.appendChild(this.topSection);\n\n        // ── Scroll-up indicator ───────────────────────────────────────────────\n        this.scrollUpBtn = document.createElement('button');\n        this.applyScrollBtnStyles(this.scrollUpBtn, 'up');\n        this.scrollUpBtn.addEventListener('click', () => {\n            this.toolsArea.scrollBy({\n                top: -(this.cfg.iconBtnSize + this.cfg.btnGap) * 3,\n                behavior: 'smooth',\n            });\n        });\n        this.el.appendChild(this.scrollUpBtn);\n\n        // ── Scrollable tools area ─────────────────────────────────────────────\n        this.toolsArea = document.createElement('div');\n        Object.assign(this.toolsArea.style, {\n            flex:            '1',\n            overflowY:       'scroll',\n            padding:         `10px ${this.cfg.barPadding}px 4px`,\n            boxSizing:       'border-box',\n            scrollbarWidth:  'none',\n            msOverflowStyle: 'none',\n        });\n        const styleTag = document.createElement('style');\n        styleTag.textContent = '.lb-tools::-webkit-scrollbar{display:none}';\n        document.head.appendChild(styleTag);\n        this.toolsArea.classList.add('lb-tools');\n\n        this.toolsGrid = this.makeGrid();\n        this.populateCategoryGrid(this.toolsGrid);\n        this.toolsArea.appendChild(this.toolsGrid);\n\n        this.toolsArea.addEventListener('scroll', () => this.updateScrollIndicators());\n        this.el.appendChild(this.toolsArea);\n\n        // ── Scroll-down indicator ─────────────────────────────────────────────\n        this.scrollDownBtn = document.createElement('button');\n        this.applyScrollBtnStyles(this.scrollDownBtn, 'down');\n        this.scrollDownBtn.addEventListener('click', () => {\n            this.toolsArea.scrollBy({\n                top: (this.cfg.iconBtnSize + this.cfg.btnGap) * 3,\n                behavior: 'smooth',\n            });\n        });\n        this.el.appendChild(this.scrollDownBtn);\n\n        requestAnimationFrame(() => this.updateScrollIndicators());\n    }\n\n    private buildMobileActionsBtn(): HTMLButtonElement {\n        const btn = document.createElement('button');\n        btn.title = this.labels.actions.moreActions;\n        btn.innerHTML = ICON_MORE_ACTIONS;\n        this.applyActionBtnStyles(btn, false);\n        this.addBtnHover(btn);\n        btn.addEventListener('click', (e) => {\n            e.stopPropagation();\n            this.toggleActionsFlyout(btn);\n        });\n        return btn;\n    }\n\n    private populateCategoryGrid(grid: HTMLDivElement): void {\n        this.catButtons.clear();\n        for (const cat of CATEGORIES) {\n            const btn = document.createElement('button');\n            btn.title = this.getCategoryLabel(cat.id);\n            btn.innerHTML = ICON_CAT[cat.id] ?? cat.icon;\n            this.applyCatBtnStyles(btn, false);\n            this.addBtnHover(btn);\n            btn.addEventListener('click', (e) => {\n                e.stopPropagation();\n                this.toggleCategory(cat, btn);\n            });\n            this.catButtons.set(cat.id, btn);\n            grid.appendChild(btn);\n        }\n    }\n\n    private updateScrollIndicators(): void {\n        const { scrollTop, scrollHeight, clientHeight } = this.toolsArea;\n        const canScrollUp   = scrollTop > 2;\n        const canScrollDown = scrollTop + clientHeight < scrollHeight - 2;\n        if (this.mobileMode) {\n            // Always visible in mobile; opacity indicates whether scrolling is possible\n            this.scrollUpBtn.style.display   = 'flex';\n            this.scrollDownBtn.style.display = 'flex';\n            this.scrollUpBtn.style.opacity   = canScrollUp   ? '0.9' : '0.2';\n            this.scrollDownBtn.style.opacity = canScrollDown ? '0.9' : '0.2';\n        } else {\n            this.scrollUpBtn.style.display   = canScrollUp   ? 'flex' : 'none';\n            this.scrollDownBtn.style.display = canScrollDown ? 'flex' : 'none';\n        }\n    }\n\n    private buildFlyout(): void {\n        Object.assign(this.flyout.style, {\n            position:     'fixed',\n            zIndex:       '9999',\n            display:      'none',\n            background:   this.theme.background,\n            border:       `1px solid ${this.theme.axisBorder}`,\n            borderRadius: '6px',\n            padding:      '6px 0',\n            minWidth:     '200px',\n            boxShadow:    '0 4px 16px rgba(0,0,0,0.45)',\n            fontFamily:   this.cfg.flyoutLabelFontFamily,\n            fontSize:     this.cfg.flyoutLabelFontSize,\n        });\n    }\n\n    private makeGrid(cols = 1): HTMLDivElement {\n        const g = document.createElement('div');\n        Object.assign(g.style, {\n            display:             'grid',\n            gridTemplateColumns: `repeat(${cols}, ${this.cfg.iconBtnSize}px)`,\n            gap:                 `${this.cfg.btnGap}px`,\n        });\n        return g;\n    }\n\n    private applyScrollBtnStyles(btn: HTMLButtonElement, dir: 'up' | 'down'): void {\n        btn.innerHTML = dir === 'up' ? ICON_CHEVRON_UP : ICON_CHEVRON_DOWN;\n        btn.title       = dir === 'up' ? this.labels.scrollUp : this.labels.scrollDown;\n        const display = btn.style.display || 'none';\n        Object.assign(btn.style, {\n            display,\n            width:          '100%',\n            height:         `${this.cfg.scrollBtnHeight}px`,\n            background:     this.theme.background,\n            color:          this.theme.tooltip.text,\n            border:         'none',\n            borderBottom:   dir === 'up'   ? `1px solid ${this.theme.axisBorder}` : 'none',\n            borderTop:      dir === 'down' ? `1px solid ${this.theme.axisBorder}` : 'none',\n            fontSize:       this.cfg.scrollBtnFontSize,\n            cursor:         'pointer',\n            outline:        'none',\n            alignItems:     'center',\n            justifyContent: 'center',\n            flexShrink:     '0',\n            opacity:        '0.6',\n        });\n    }\n\n    // ── Private – category flyout ─────────────────────────────────────────────\n\n    private toggleCategory(cat: Category, anchorBtn: HTMLButtonElement): void {\n        if (this.openCategoryId === cat.id) {\n            this.closeFlyout();\n            return;\n        }\n        this.openCategoryId = cat.id;\n\n        const rect = anchorBtn.getBoundingClientRect();\n        Object.assign(this.flyout.style, {\n            display: 'block',\n            left:    `${rect.right + 4}px`,\n            top:     `${rect.top}px`,\n        });\n\n        this.flyout.innerHTML = '';\n\n        // Header\n        const header = document.createElement('div');\n        Object.assign(header.style, {\n            padding:       '4px 12px 8px',\n            fontSize:      this.cfg.flyoutHeadingFontSize,\n            fontWeight:    '600',\n            letterSpacing: this.cfg.flyoutHeadingLetterSpacing,\n            color:         this.theme.drawingToolbar.flyoutHeadingColor,\n            textTransform: 'uppercase',\n            borderBottom:  `1px solid ${this.theme.axisBorder}`,\n            marginBottom:  '4px',\n            opacity:       '0.6',\n        });\n        header.textContent = this.getCategoryLabel(cat.id);\n        this.flyout.appendChild(header);\n\n        // Tool rows\n        for (const tool of cat.tools) {\n            const isImpl   = tool.id in IMPLEMENTED;\n            const isActive = this.activeTool !== null && IMPLEMENTED[tool.id] === this.activeTool;\n            const row      = document.createElement('button');\n\n            Object.assign(row.style, {\n                width:      '100%',\n                padding:    '5px 12px',\n                background: isActive ? this.theme.ui.accentBg : 'transparent',\n                border:     'none',\n                borderLeft: isActive\n                                ? `2px solid ${this.theme.ui.accent}`\n                                : '2px solid transparent',\n                color:      isActive\n                                ? this.theme.ui.accentText\n                                : isImpl\n                                    ? this.theme.drawingToolbar.flyoutLabelColor\n                                    : this.theme.ui.disabledText,\n                fontSize:   this.cfg.flyoutLabelFontSize,\n                fontFamily: this.cfg.flyoutLabelFontFamily,\n                textAlign:  'left',\n                cursor:     isImpl ? 'pointer' : 'default',\n                display:    'flex',\n                alignItems: 'center',\n                gap:        '8px',\n                boxSizing:  'border-box',\n            });\n\n            const iconSpan = document.createElement('span');\n            Object.assign(iconSpan.style, {\n                width:      '16px',\n                display:    'flex',\n                alignItems: 'center',\n                flexShrink: '0',\n            });\n            iconSpan.innerHTML = ICON_TOOL[tool.id] ?? ICON_CAT[cat.id] ?? tool.icon;\n\n            const nameSpan = document.createElement('span');\n            nameSpan.style.flex = '1';\n            nameSpan.textContent = this.getToolLabel(tool);\n\n            row.appendChild(iconSpan);\n            row.appendChild(nameSpan);\n\n            if (tool.shortcut && isImpl) {\n                const sc = document.createElement('span');\n                Object.assign(sc.style, {\n                    fontSize:   this.cfg.shortcutFontSize,\n                    color:      this.theme.ui.disabledText,\n                    flexShrink: '0',\n                });\n                sc.textContent = tool.shortcut;\n                row.appendChild(sc);\n            } else if (!isImpl) {\n                const soon = document.createElement('span');\n                Object.assign(soon.style, {\n                    fontSize:   this.cfg.soonBadgeFontSize,\n                    color:      this.theme.ui.soonBadgeText,\n                    flexShrink: '0',\n                });\n                soon.textContent = this.labels.soonBadge;\n                row.appendChild(soon);\n            }\n\n            if (isImpl) {\n                if (!isActive) {\n                    const hoverBg = this.theme.ui.accentBg;\n                    row.addEventListener('mouseenter', () => { row.style.background = hoverBg; });\n                    row.addEventListener('mouseleave', () => { row.style.background = 'transparent'; });\n                }\n                row.addEventListener('click', () => {\n                    const drawingType = IMPLEMENTED[tool.id];\n                    const next = this.activeTool === drawingType ? null : drawingType;\n                    this.setActiveTool(next);\n                    this.onToolChange(next);\n                    this.closeFlyout();\n                    // On mobile, auto-close the bar after a tool is selected\n                    if (this.mobileMode && next !== null) {\n                        this.settingsVisible = false;\n                        this.applyWidth();\n                        this.onMobileClose?.();\n                    }\n                });\n            }\n\n            this.flyout.appendChild(row);\n        }\n\n        requestAnimationFrame(() => {\n            const flyRect = this.flyout.getBoundingClientRect();\n            if (flyRect.bottom > window.innerHeight - 8) {\n                this.flyout.style.top = `${window.innerHeight - flyRect.height - 8}px`;\n            }\n        });\n    }\n\n    private closeFlyout(): void {\n        this.flyout.style.display = 'none';\n        this.openCategoryId = null;\n        this.openActionsMenu = false;\n    }\n\n    private toggleActionsFlyout(anchorBtn: HTMLButtonElement): void {\n        if (this.openActionsMenu) {\n            this.closeFlyout();\n            return;\n        }\n        this.closeFlyout();\n        this.openActionsMenu = true;\n\n        this.flyout.innerHTML = '';\n\n        // Header\n        const header = document.createElement('div');\n        Object.assign(header.style, {\n            padding:       '4px 12px 8px',\n            fontSize:      this.cfg.flyoutHeadingFontSize,\n            fontWeight:    '600',\n            letterSpacing: this.cfg.flyoutHeadingLetterSpacing,\n            color:         this.theme.drawingToolbar.flyoutHeadingColor,\n            textTransform: 'uppercase',\n            borderBottom:  `1px solid ${this.theme.axisBorder}`,\n            marginBottom:  '4px',\n            opacity:       '0.6',\n        });\n        header.textContent = this.labels.actions.moreActions;\n        this.flyout.appendChild(header);\n\n        for (const action of ACTIONS) {\n            const isToggled = action.id === 'toggle_visibility' ? this.drawingsHidden\n                            : action.id === 'toggle_lock'       ? this.drawingsLocked\n                            : false;\n\n            const currentIcon = isToggled\n                ? (ICON_ACTION_TOGGLED[action.id] ?? ICON_ACTION[action.id] ?? action.icon)\n                : (ICON_ACTION[action.id] ?? action.icon);\n\n            const label = action.id === 'toggle_visibility'\n                ? (this.drawingsHidden ? this.labels.actions.showAll : this.labels.actions.hideAll)\n                : action.id === 'toggle_lock'\n                ? (this.drawingsLocked ? this.labels.actions.unlockAll : this.labels.actions.lockAll)\n                : this.getActionLabel(action.id);\n\n            const row = document.createElement('button');\n            Object.assign(row.style, {\n                width:      '100%',\n                padding:    '6px 12px',\n                background: isToggled ? this.theme.ui.accentBg : 'transparent',\n                border:     'none',\n                borderLeft: isToggled\n                                ? `2px solid ${this.theme.ui.accent}`\n                                : '2px solid transparent',\n                color:      isToggled\n                                ? this.theme.ui.accentText\n                                : this.theme.drawingToolbar.flyoutLabelColor,\n                fontSize:   this.cfg.flyoutLabelFontSize,\n                fontFamily: this.cfg.flyoutLabelFontFamily,\n                textAlign:  'left',\n                cursor:     'pointer',\n                display:    'flex',\n                alignItems: 'center',\n                gap:        '8px',\n                boxSizing:  'border-box',\n            });\n\n            const iconSpan = document.createElement('span');\n            Object.assign(iconSpan.style, {\n                width:      '16px',\n                display:    'flex',\n                alignItems: 'center',\n                flexShrink: '0',\n            });\n            iconSpan.innerHTML = currentIcon;\n\n            const nameSpan = document.createElement('span');\n            nameSpan.style.flex = '1';\n            nameSpan.textContent = label;\n\n            row.appendChild(iconSpan);\n            row.appendChild(nameSpan);\n\n            const hoverBg = this.theme.ui.accentBg;\n            if (!isToggled) {\n                row.addEventListener('mouseenter', () => { row.style.background = hoverBg; });\n                row.addEventListener('mouseleave', () => { row.style.background = 'transparent'; });\n            }\n\n            row.addEventListener('click', () => {\n                if (action.id === 'toggle_visibility') {\n                    this.drawingsHidden = !this.drawingsHidden;\n                    this.onAction(this.drawingsHidden ? 'hide_all' : 'show_all');\n                } else if (action.id === 'toggle_lock') {\n                    this.drawingsLocked = !this.drawingsLocked;\n                    this.onAction(this.drawingsLocked ? 'lock_all' : 'unlock_all');\n                } else {\n                    this.onAction(action.id);\n                }\n                this.closeFlyout();\n            });\n\n            this.flyout.appendChild(row);\n        }\n\n        const rect = anchorBtn.getBoundingClientRect();\n        const elRect = this.el.getBoundingClientRect();\n        Object.assign(this.flyout.style, {\n            display: 'block',\n            left:    `${elRect.right + 4}px`,\n            top:     `${rect.top}px`,\n        });\n\n        requestAnimationFrame(() => {\n            const flyRect = this.flyout.getBoundingClientRect();\n            if (flyRect.bottom > window.innerHeight - 8) {\n                this.flyout.style.top = `${window.innerHeight - flyRect.height - 8}px`;\n            }\n        });\n    }\n\n    // ── Private – label helpers ───────────────────────────────────────────────\n\n    private getCategoryLabel(catId: string): string {\n        const map: Record<string, keyof DrawingToolbarLabels['categories']> = {\n            trend_lines:       'trendLines',\n            fibonacci_gann:    'fibonacci',\n            geometric_shapes:  'shapes',\n            measurement_tools: 'measurements',\n            pitchfork_tools:   'pitchforks',\n            volume_statistics: 'volume',\n            annotation_tools:  'annotations',\n            pattern_recognition: 'patterns',\n            elliott_wave:      'elliott',\n            brush_highlighter: 'brushes',\n            advanced_tools:    'advanced',\n            price_projections: 'priceProjection',\n        };\n        const key = map[catId];\n        return key ? this.labels.categories[key] : catId;\n    }\n\n    private getToolLabel(tool: Tool): string {\n        const drawingType = IMPLEMENTED[tool.id];\n        if (drawingType && this.labels.tools[drawingType]) {\n            return this.labels.tools[drawingType];\n        }\n        return tool.name;\n    }\n\n    private getActionLabel(actionId: string): string {\n        const map: Record<string, keyof DrawingToolbarLabels['actions']> = {\n            undo:              'undo',\n            redo:              'redo',\n            delete_selected:   'deleteSelected',\n            clear_all:         'clearAll',\n            toggle_visibility: 'hideAll',\n            toggle_lock:       'lockAll',\n        };\n        const key = map[actionId];\n        return key ? this.labels.actions[key] : actionId;\n    }\n\n    // ── Private – styling helpers ─────────────────────────────────────────────\n\n    private addBtnHover(btn: HTMLButtonElement): void {\n        btn.addEventListener('mouseenter', () => {\n            if (btn.dataset.active !== 'true') btn.style.background = this.theme.ui.accentBg;\n        });\n        btn.addEventListener('mouseleave', () => {\n            if (btn.dataset.active !== 'true') btn.style.background = 'transparent';\n        });\n    }\n\n    private applyCatBtnStyles(btn: HTMLButtonElement, active: boolean): void {\n        btn.dataset.active = String(active);\n        Object.assign(btn.style, {\n            width:          `${this.cfg.iconBtnSize}px`,\n            height:         `${this.cfg.iconBtnSize}px`,\n            background:     active ? this.theme.ui.accentBgStrong : 'transparent',\n            color:          active\n                                ? this.theme.drawingToolbar.activeIconColor\n                                : this.theme.drawingToolbar.iconColor,\n            border:         `1px solid ${active ? this.theme.ui.accent : this.theme.axisBorder}`,\n            borderRadius:   '5px',\n            cursor:         'pointer',\n            outline:        'none',\n            display:        'flex',\n            alignItems:     'center',\n            justifyContent: 'center',\n            padding:        '0',\n        });\n    }\n\n    private applyActionBtnStyles(btn: HTMLButtonElement, toggled: boolean): void {\n        btn.dataset.active = String(toggled);\n        Object.assign(btn.style, {\n            width:          `${this.cfg.iconBtnSize}px`,\n            height:         `${this.cfg.iconBtnSize}px`,\n            background:     toggled ? this.theme.ui.accentBg : 'transparent',\n            color:          toggled\n                                ? this.theme.drawingToolbar.activeIconColor\n                                : this.theme.drawingToolbar.iconColor,\n            border:         `1px solid ${toggled ? this.theme.ui.accent : this.theme.axisBorder}`,\n            borderRadius:   '5px',\n            cursor:         'pointer',\n            outline:        'none',\n            display:        'flex',\n            alignItems:     'center',\n            justifyContent: 'center',\n            padding:        '0',\n        });\n    }\n}\n","import type {\n    AnyDrawingStyle,\n    DrawingStyle,\n    DrawingTextStyle,\n    DrawingFibStyle,\n    DrawingLevelStyle,\n    DrawingToolType,\n} from '../core/types.js';\nimport type { ChartTheme } from '../core/themes.js';\n\n/**\n * Merge an instance style over the theme default for a drawing type. The\n * returned object contains every field the caller may need; theme-provided\n * fields fall back to safe defaults when the theme entry is missing one.\n *\n * Drawings call this once per render to get a single resolved style object,\n * then read fields off it (e.g. `s.strokeColor`).\n */\nexport function resolveStyle(\n    type: DrawingToolType,\n    instanceStyle: AnyDrawingStyle | undefined,\n    theme: ChartTheme | undefined,\n): Required<DrawingStyle> & Partial<DrawingTextStyle> & Partial<DrawingFibStyle> {\n    const themeEntry = (theme?.drawing?.[type] ?? {}) as AnyDrawingStyle;\n    const merged = { ...themeEntry, ...(instanceStyle ?? {}) } as AnyDrawingStyle;\n\n    // For DrawingFibStyle, deep-merge per-level entries so an override on one\n    // level doesn't drop the others.\n    const themeLevels = (themeEntry as DrawingFibStyle).levels;\n    const instLevels  = (instanceStyle as DrawingFibStyle | undefined)?.levels;\n    if (themeLevels || instLevels) {\n        const out: Record<string, DrawingLevelStyle> = { ...(themeLevels ?? {}) };\n        if (instLevels) {\n            for (const k of Object.keys(instLevels)) {\n                out[k] = { ...(out[k] ?? { visible: true, color: '#888888' }), ...instLevels[k] };\n            }\n        }\n        (merged as DrawingFibStyle).levels = out;\n    }\n\n    return {\n        strokeColor:  merged.strokeColor  ?? '#888888',\n        lineWidth:    merged.lineWidth    ?? 1,\n        lineStyle:    merged.lineStyle    ?? 'solid',\n        fillColor:    merged.fillColor    ?? merged.strokeColor ?? '#888888',\n        fillOpacity:  merged.fillOpacity  ?? 0.1,\n        ...((merged as DrawingTextStyle).textColor !== undefined && { textColor: (merged as DrawingTextStyle).textColor }),\n        ...((merged as DrawingTextStyle).fontSize  !== undefined && { fontSize:  (merged as DrawingTextStyle).fontSize }),\n        ...((merged as DrawingFibStyle).levels      !== undefined && { levels:    (merged as DrawingFibStyle).levels }),\n    };\n}\n\n/** Apply a line-style dash pattern to the canvas context, scaled to width. */\nexport function applyLineStyle(\n    ctx: CanvasRenderingContext2D,\n    style: 'solid' | 'dashed' | 'dotted',\n    width: number,\n): void {\n    const w = Math.max(1, width);\n    if (style === 'dashed')      ctx.setLineDash([6 * w, 3 * w]);\n    else if (style === 'dotted') ctx.setLineDash([2 * w, 3 * w]);\n    else                          ctx.setLineDash([]);\n}\n\n/**\n * Combine a hex color with an alpha value (0..1). Accepts `#rgb`, `#rgba`,\n * `#rrggbb`, or `#rrggbbaa`. Non-hex inputs (named colors, `rgba()`, CSS vars)\n * are returned unchanged.\n */\nexport function hexWithAlpha(hex: string, alpha: number): string {\n    if (!hex.startsWith('#')) return hex;\n    const a = Math.max(0, Math.min(1, alpha));\n    const aHex = Math.round(a * 255).toString(16).padStart(2, '0');\n    let body = hex.slice(1);\n    if (body.length === 3) body = body.split('').map(c => c + c).join('');\n    else if (body.length === 4) body = body.slice(0, 3).split('').map(c => c + c).join('');\n    else if (body.length === 8) body = body.slice(0, 6);\n    if (body.length !== 6) return hex;\n    return `#${body}${aHex}`;\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6; // px\n\nexport class HorizontalLine implements IDrawing {\n    readonly id: string;\n    readonly type = 'horizontalLine' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(point: DrawingPoint) {\n        this.id = `hl_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [point];\n        this.complete = true; // single-click placement\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        _viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        pricePrecision = 2,\n        theme?: ChartTheme,\n    ): void {\n        const price = this.points[0].price;\n        const y = scale.yToPixel(price, priceRange, chartH);\n\n        const s = resolveStyle('horizontalLine', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth   = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n        ctx.beginPath();\n        ctx.moveTo(0, y);\n        ctx.lineTo(chartW, y);\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        // Price label\n        const label = price.toFixed(pricePrecision);\n        ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n        const tw = ctx.measureText(label).width;\n        ctx.fillStyle = s.strokeColor;\n        ctx.fillText(label, chartW - tw - 4, y - 3);\n        ctx.restore();\n    }\n\n    hitTest(\n        _x: number,\n        y: number,\n        scale: ScaleManager,\n        _viewport: Viewport,\n        priceRange: PriceRange,\n        _chartW: number,\n        chartH: number,\n    ): boolean {\n        const lineY = scale.yToPixel(this.points[0].price, priceRange, chartH);\n        return Math.abs(y - lineY) <= HIT_TOLERANCE;\n    }\n\n    getHandle(): DrawingHandle | null {\n        return null; // full-width line — no endpoint handles\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6; // px\n\nexport class VerticalLine implements IDrawing {\n    readonly id: string;\n    readonly type = 'verticalLine' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(point: DrawingPoint) {\n        this.id = `vl_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [point];\n        this.complete = true; // single-click placement\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        _priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        const x = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n\n        const s = resolveStyle('verticalLine', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth   = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n        ctx.beginPath();\n        ctx.moveTo(x, 0);\n        ctx.lineTo(x, chartH);\n        ctx.stroke();\n        ctx.setLineDash([]);\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        _y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        _priceRange: PriceRange,\n        chartW: number,\n        _chartH: number,\n    ): boolean {\n        const lineX = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n        return Math.abs(x - lineX) <= HIT_TOLERANCE;\n    }\n\n    getHandle(): DrawingHandle | null {\n        return null; // full-height line — no endpoint handles\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6; // px\n\n/** Distance from point (px, py) to line segment (x1,y1)-(x2,y2) */\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class TrendLine implements IDrawing {\n    readonly id: string;\n    readonly type = 'trendLine' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `tl_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }]; // second point tracks mouse until complete\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const s = resolveStyle('trendLine', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth   = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        ctx.beginPath();\n        ctx.moveTo(x1, y1);\n        ctx.lineTo(x2, y2);\n        ctx.stroke();\n\n        ctx.setLineDash([]);\n\n        // Anchor dots\n        for (const [x, y] of [[x1, y1], [x2, y2]] as [number, number][]) {\n            ctx.beginPath();\n            ctx.arc(x, y, isSelected ? 4 : 3, 0, Math.PI * 2);\n            ctx.fillStyle = s.strokeColor;\n            ctx.fill();\n        }\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n        return pointToSegmentDist(x, y, x1, y1, x2, y2) <= HIT_TOLERANCE;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const pts = [\n            { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n            { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n        ];\n        for (let i = 0; i < pts.length; i++) {\n            if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class TrendAngle implements IDrawing {\n    readonly id: string;\n    readonly type = 'trendAngle' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `ta_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const angleDeg = Math.atan2(-(y2 - y1), x2 - x1) * 180 / Math.PI;\n        const angleRad = Math.atan2(-(y2 - y1), x2 - x1);\n\n        const s = resolveStyle('trendAngle', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.fillStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        // Main trend line\n        ctx.beginPath();\n        ctx.moveTo(x1, y1);\n        ctx.lineTo(x2, y2);\n        ctx.stroke();\n\n        // Angle arc at p1\n        const arcRadius = 28;\n        ctx.beginPath();\n        ctx.arc(x1, y1, arcRadius, -angleRad, 0, angleRad < 0);\n        ctx.stroke();\n\n        // Horizontal reference line from p1\n        ctx.setLineDash([4, 3]);\n        ctx.globalAlpha = 0.5;\n        ctx.beginPath();\n        ctx.moveTo(x1, y1);\n        ctx.lineTo(x1 + arcRadius + 8, y1);\n        ctx.stroke();\n        ctx.setLineDash([]);\n        ctx.globalAlpha = 1;\n\n        // Angle label\n        const labelX = x1 + arcRadius + 6;\n        const labelY = y1 - (angleRad >= 0 ? 6 : -14);\n        ctx.font = \"bold 11px 'Inter', system-ui, sans-serif\";\n        ctx.fillText(`${angleDeg.toFixed(1)}°`, labelX, labelY);\n\n        // Anchor dots\n        if (isSelected) {\n            for (const [ax, ay] of [[x1, y1], [x2, y2]] as [number, number][]) {\n                ctx.beginPath();\n                ctx.arc(ax, ay, 4, 0, Math.PI * 2);\n                ctx.fill();\n            }\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n        return pointToSegmentDist(x, y, x1, y1, x2, y2) <= HIT_TOLERANCE;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const pts = [\n            { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n            { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n        ];\n        for (let i = 0; i < pts.length; i++) {\n            if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nexport class CrossLine implements IDrawing {\n    readonly id: string;\n    readonly type = 'crossLine' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(point: DrawingPoint) {\n        this.id = `xl_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [point];\n        this.complete = true;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        const p = this.points[0];\n        const x = scale.xToPixel(p.barIndex, viewport, chartW);\n        const y = scale.yToPixel(p.price, priceRange, chartH);\n\n        const s = resolveStyle('crossLine', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        // Horizontal line across full width\n        ctx.beginPath();\n        ctx.moveTo(0, y);\n        ctx.lineTo(chartW, y);\n        ctx.stroke();\n\n        // Vertical line at barIndex\n        ctx.beginPath();\n        ctx.moveTo(x, 0);\n        ctx.lineTo(x, chartH);\n        ctx.stroke();\n\n        ctx.setLineDash([]);\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        const p = this.points[0];\n        const lineX = scale.xToPixel(p.barIndex, viewport, chartW);\n        const lineY = scale.yToPixel(p.price, priceRange, chartH);\n        // Near horizontal line\n        if (Math.abs(y - lineY) <= HIT_TOLERANCE) return true;\n        // Near vertical line\n        if (Math.abs(x - lineX) <= HIT_TOLERANCE) return true;\n        return false;\n    }\n\n    getHandle(): DrawingHandle | null {\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class ParallelChannel implements IDrawing {\n    readonly id: string;\n    readonly type = 'parallelChannel' as const;\n    readonly requiredPoints = 3;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `pch_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2, p3] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        // Offset based on p3 price vs midpoint of p1-p2\n        let offsetY = 0;\n        if (p3) {\n            const midPrice = (p1.price + p2.price) / 2;\n            const midPixelY = scale.yToPixel(midPrice, priceRange, chartH);\n            const p3PixelY = scale.yToPixel(p3.price, priceRange, chartH);\n            offsetY = p3PixelY - midPixelY;\n        }\n\n        const ox1 = x1, oy1 = y1 + offsetY;\n        const ox2 = x2, oy2 = y2 + offsetY;\n\n        const s = resolveStyle('parallelChannel', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        // Fill between lines\n        ctx.beginPath();\n        ctx.moveTo(x1, y1);\n        ctx.lineTo(x2, y2);\n        ctx.lineTo(ox2, oy2);\n        ctx.lineTo(ox1, oy1);\n        ctx.closePath();\n        ctx.fillStyle = hexWithAlpha(s.fillColor, s.fillOpacity);\n        ctx.fill();\n\n        // Main line p1 -> p2\n        ctx.beginPath();\n        ctx.moveTo(x1, y1);\n        ctx.lineTo(x2, y2);\n        ctx.stroke();\n\n        // Parallel line\n        if (p3) {\n            ctx.beginPath();\n            ctx.moveTo(ox1, oy1);\n            ctx.lineTo(ox2, oy2);\n            ctx.stroke();\n        }\n\n        ctx.setLineDash([]);\n\n        // Anchor dots\n        if (isSelected) {\n            const anchorPts: [number, number][] = [[x1, y1], [x2, y2]];\n            if (p3) {\n                const p3x = scale.xToPixel(p3.barIndex, viewport, chartW);\n                const p3y = scale.yToPixel(p3.price, priceRange, chartH);\n                anchorPts.push([p3x, p3y]);\n            }\n            ctx.fillStyle = s.strokeColor;\n            for (const [ax, ay] of anchorPts) {\n                ctx.beginPath();\n                ctx.arc(ax, ay, 4, 0, Math.PI * 2);\n                ctx.fill();\n            }\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2, p3] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        if (pointToSegmentDist(x, y, x1, y1, x2, y2) <= HIT_TOLERANCE) return true;\n\n        if (p3) {\n            const midPrice = (p1.price + p2.price) / 2;\n            const midPixelY = scale.yToPixel(midPrice, priceRange, chartH);\n            const p3PixelY = scale.yToPixel(p3.price, priceRange, chartH);\n            const offsetY = p3PixelY - midPixelY;\n            if (pointToSegmentDist(x, y, x1, y1 + offsetY, x2, y2 + offsetY) <= HIT_TOLERANCE) return true;\n        }\n\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        const candidates = this.points.map((p, i) => ({\n            i,\n            px: scale.xToPixel(p.barIndex, viewport, chartW),\n            py: scale.yToPixel(p.price, priceRange, chartH),\n        }));\n        for (const { i, px, py } of candidates) {\n            if (Math.hypot(x - px, y - py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class FlatChannel implements IDrawing {\n    readonly id: string;\n    readonly type = 'flatChannel' as const;\n    readonly requiredPoints = 3;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `fch_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2, p3] = this.points;\n\n        // First line is horizontal at p1.price from p1.barIndex to p2.barIndex\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n\n        // Second line is horizontal at (p1.price + priceOffset)\n        const priceOffset = p3 ? p3.price - p1.price : 0;\n        const y2 = scale.yToPixel(p1.price + priceOffset, priceRange, chartH);\n\n        const s = resolveStyle('flatChannel', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        // Fill between lines\n        ctx.beginPath();\n        ctx.rect(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x2 - x1), Math.abs(y2 - y1));\n        ctx.fillStyle = hexWithAlpha(s.fillColor, s.fillOpacity);\n        ctx.fill();\n\n        // First horizontal line\n        ctx.beginPath();\n        ctx.moveTo(x1, y1);\n        ctx.lineTo(x2, y1);\n        ctx.stroke();\n\n        // Second horizontal line (shown once p3 exists)\n        if (p3) {\n            ctx.beginPath();\n            ctx.moveTo(x1, y2);\n            ctx.lineTo(x2, y2);\n            ctx.stroke();\n        }\n\n        ctx.setLineDash([]);\n\n        // Anchor dots\n        if (isSelected) {\n            ctx.fillStyle = s.strokeColor;\n            const anchorPts: [number, number][] = [[x1, y1], [x2, y1]];\n            if (p3) {\n                const p3x = scale.xToPixel(p3.barIndex, viewport, chartW);\n                const p3y = scale.yToPixel(p3.price, priceRange, chartH);\n                anchorPts.push([p3x, p3y]);\n            }\n            for (const [ax, ay] of anchorPts) {\n                ctx.beginPath();\n                ctx.arc(ax, ay, 4, 0, Math.PI * 2);\n                ctx.fill();\n            }\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2, p3] = this.points;\n\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n\n        if (pointToSegmentDist(x, y, x1, y1, x2, y1) <= HIT_TOLERANCE) return true;\n\n        if (p3) {\n            const priceOffset = p3.price - p1.price;\n            const y2 = scale.yToPixel(p1.price + priceOffset, priceRange, chartH);\n            if (pointToSegmentDist(x, y, x1, y2, x2, y2) <= HIT_TOLERANCE) return true;\n        }\n\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        const candidates = this.points.map((p, i) => ({\n            i,\n            px: scale.xToPixel(p.barIndex, viewport, chartW),\n            py: scale.yToPixel(p.price, priceRange, chartH),\n        }));\n        for (const { i, px, py } of candidates) {\n            if (Math.hypot(x - px, y - py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class DisjointChannel implements IDrawing {\n    readonly id: string;\n    readonly type = 'disjointChannel' as const;\n    readonly requiredPoints = 4;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `dch_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const toXY = (p: DrawingPoint): [number, number] => [\n            scale.xToPixel(p.barIndex, viewport, chartW),\n            scale.yToPixel(p.price, priceRange, chartH),\n        ];\n\n        const [p1, p2, p3, p4] = this.points;\n        const [x1, y1] = toXY(p1);\n        const [x2, y2] = toXY(p2);\n\n        const s = resolveStyle('disjointChannel', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        // If we have all 4 points, draw filled polygon\n        if (p3 && p4) {\n            const [x3, y3] = toXY(p3);\n            const [x4, y4] = toXY(p4);\n\n            ctx.beginPath();\n            ctx.moveTo(x1, y1);\n            ctx.lineTo(x2, y2);\n            ctx.lineTo(x4, y4);\n            ctx.lineTo(x3, y3);\n            ctx.closePath();\n            ctx.fillStyle = hexWithAlpha(s.fillColor, s.fillOpacity);\n            ctx.fill();\n\n            // First segment p1 -> p2\n            ctx.beginPath();\n            ctx.moveTo(x1, y1);\n            ctx.lineTo(x2, y2);\n            ctx.stroke();\n\n            // Second segment p3 -> p4\n            ctx.beginPath();\n            ctx.moveTo(x3, y3);\n            ctx.lineTo(x4, y4);\n            ctx.stroke();\n\n            ctx.setLineDash([]);\n\n            if (isSelected) {\n                ctx.fillStyle = s.strokeColor;\n                for (const [ax, ay] of [[x1, y1], [x2, y2], [x3, y3], [x4, y4]] as [number, number][]) {\n                    ctx.beginPath();\n                    ctx.arc(ax, ay, 4, 0, Math.PI * 2);\n                    ctx.fill();\n                }\n            }\n        } else if (p3) {\n            const [x3, y3] = toXY(p3);\n\n            // First segment\n            ctx.beginPath();\n            ctx.moveTo(x1, y1);\n            ctx.lineTo(x2, y2);\n            ctx.stroke();\n\n            // Third point so far (tracking 4th)\n            ctx.beginPath();\n            ctx.moveTo(x3, y3);\n            ctx.lineTo(x3, y3);\n            ctx.stroke();\n\n            ctx.setLineDash([]);\n\n            if (isSelected) {\n                ctx.fillStyle = s.strokeColor;\n                for (const [ax, ay] of [[x1, y1], [x2, y2], [x3, y3]] as [number, number][]) {\n                    ctx.beginPath();\n                    ctx.arc(ax, ay, 4, 0, Math.PI * 2);\n                    ctx.fill();\n                }\n            }\n        } else {\n            // Only first segment being drawn\n            ctx.beginPath();\n            ctx.moveTo(x1, y1);\n            ctx.lineTo(x2, y2);\n            ctx.stroke();\n\n            ctx.setLineDash([]);\n\n            if (isSelected) {\n                ctx.fillStyle = s.strokeColor;\n                for (const [ax, ay] of [[x1, y1], [x2, y2]] as [number, number][]) {\n                    ctx.beginPath();\n                    ctx.arc(ax, ay, 4, 0, Math.PI * 2);\n                    ctx.fill();\n                }\n            }\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n\n        const toXY = (p: DrawingPoint): [number, number] => [\n            scale.xToPixel(p.barIndex, viewport, chartW),\n            scale.yToPixel(p.price, priceRange, chartH),\n        ];\n\n        const [p1, p2, p3, p4] = this.points;\n        const [x1, y1] = toXY(p1);\n        const [x2, y2] = toXY(p2);\n\n        if (pointToSegmentDist(x, y, x1, y1, x2, y2) <= HIT_TOLERANCE) return true;\n\n        if (p3 && p4) {\n            const [x3, y3] = toXY(p3);\n            const [x4, y4] = toXY(p4);\n            if (pointToSegmentDist(x, y, x3, y3, x4, y4) <= HIT_TOLERANCE) return true;\n        }\n\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        const candidates = this.points.map((p, i) => ({\n            i,\n            px: scale.xToPixel(p.barIndex, viewport, chartW),\n            py: scale.yToPixel(p.price, priceRange, chartH),\n        }));\n        for (const { i, px, py } of candidates) {\n            if (Math.hypot(x - px, y - py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\n\nconst FIB_LEVELS = [0, 0.236, 0.382, 0.5, 0.618, 0.786, 1];\nconst FIB_FALLBACK_COLORS = ['#ef5350', '#e8b84b', '#26a69a', '#2196f3', '#26a69a', '#e8b84b', '#ef5350'];\nconst HIT_TOLERANCE = 6;\n\nexport class FibRetracement implements IDrawing {\n    readonly id: string;\n    readonly type = 'fibRetracement' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `fib_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        pricePrecision = 2,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const highPrice = Math.max(p1.price, p2.price);\n        const lowPrice  = Math.min(p1.price, p2.price);\n        const range     = highPrice - lowPrice;\n\n        const x1   = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1   = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2   = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2   = scale.yToPixel(p2.price, priceRange, chartH);\n        const xMin = Math.min(x1, x2);\n        const xMax = Math.max(x1, x2);\n\n        const s = resolveStyle('fibRetracement', this.style, theme);\n        const baseLineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        const anchorColor = s.strokeColor ?? FIB_FALLBACK_COLORS[1];\n\n        ctx.save();\n        ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n        ctx.lineWidth = baseLineWidth;\n\n        for (let i = 0; i < FIB_LEVELS.length; i++) {\n            const level  = FIB_LEVELS[i];\n            const key    = String(level);\n            const lvl    = s.levels?.[key];\n            if (lvl?.visible === false) continue;\n\n            const price  = highPrice - range * level;\n            const y      = scale.yToPixel(price, priceRange, chartH);\n            const baseColor = lvl?.color ?? s.strokeColor ?? FIB_FALLBACK_COLORS[i];\n            const color  = hexWithAlpha(baseColor, isSelected ? 0.8 : 0.6);\n\n            ctx.strokeStyle = color;\n            applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, baseLineWidth);\n            ctx.beginPath();\n            ctx.moveTo(xMin, y);\n            ctx.lineTo(xMax, y);\n            ctx.stroke();\n            ctx.setLineDash([]);\n\n            // Label inside the bounded region\n            const pct = `${(level * 100).toFixed(1)}%`;\n            const lbl = `${pct}  ${price.toFixed(pricePrecision)}`;\n            ctx.fillStyle = color;\n            ctx.fillText(lbl, xMin + 4, y - 3);\n        }\n\n        // Anchor dots on the two defining points\n\n        for (const [ax, ay] of [[x1, y1], [x2, y2]] as [number, number][]) {\n            ctx.beginPath();\n            ctx.arc(ax, ay, isSelected ? 4 : 3, 0, Math.PI * 2);\n            ctx.fillStyle = anchorColor;\n            ctx.fill();\n        }\n        ctx.restore();\n    }\n\n    hitTest(\n        _x: number,\n        y: number,\n        scale: ScaleManager,\n        _viewport: Viewport,\n        priceRange: PriceRange,\n        _chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const highPrice = Math.max(this.points[0].price, this.points[1].price);\n        const lowPrice  = Math.min(this.points[0].price, this.points[1].price);\n        const range     = highPrice - lowPrice;\n\n        for (const level of FIB_LEVELS) {\n            const price  = highPrice - range * level;\n            const lineY  = scale.yToPixel(price, priceRange, chartH);\n            if (Math.abs(y - lineY) <= HIT_TOLERANCE) return true;\n        }\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const anchors = [\n            { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n            { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n        ];\n        for (let i = 0; i < anchors.length; i++) {\n            if (Math.hypot(x - anchors[i].px, y - anchors[i].py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nconst FIB_EXT_LEVELS = [0, 0.382, 0.618, 1, 1.382, 1.618, 2.0, 2.618];\nconst FIB_EXT_FALLBACK_COLORS = ['#ef5350', '#e8b84b', '#26a69a', '#2196f3', '#26a69a', '#e8b84b', '#ef5350', '#ef5350'];\n\nexport class FibExtension implements IDrawing {\n    readonly id: string;\n    readonly type = 'fibExtension' as const;\n    readonly requiredPoints = 3;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `fext_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        pricePrecision = 2,\n        theme?: ChartTheme,\n    ): void {\n        const [p1, p2, p3] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const s = resolveStyle('fibExtension', this.style, theme);\n        const anchorColor = s.strokeColor ?? '#e8b84b';\n        const connectorColor = hexWithAlpha(s.strokeColor ?? '#888888', 0.67);\n\n        // Phase 1 preview: show the swing (p1→p2) being defined\n        if (!p3) {\n            ctx.save();\n            ctx.strokeStyle = connectorColor;\n            ctx.lineWidth = 1;\n            ctx.setLineDash([4, 3]);\n            ctx.beginPath();\n            ctx.moveTo(x1, y1);\n            ctx.lineTo(x2, y2);\n            ctx.stroke();\n            ctx.setLineDash([]);\n            ctx.fillStyle = anchorColor;\n            ctx.beginPath();\n            ctx.arc(x1, y1, 3, 0, Math.PI * 2);\n            ctx.fill();\n            ctx.restore();\n            return;\n        }\n\n        const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n        const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n        const xMin = Math.min(x1, x2, x3);\n        const xMax = Math.max(x1, x2, x3);\n\n        const priceMove = p2.price - p1.price;\n        const baseLineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n\n        ctx.save();\n        ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n        ctx.lineWidth = baseLineWidth;\n\n        // Draw connecting lines between anchors (dashed)\n        ctx.strokeStyle = connectorColor;\n        ctx.setLineDash([4, 3]);\n        ctx.beginPath();\n        ctx.moveTo(x1, y1);\n        ctx.lineTo(x2, y2);\n        ctx.stroke();\n        ctx.beginPath();\n        ctx.moveTo(x2, y2);\n        ctx.lineTo(x3, y3);\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        // Draw extension level lines\n        for (let i = 0; i < FIB_EXT_LEVELS.length; i++) {\n            const level = FIB_EXT_LEVELS[i];\n            const key = String(level);\n            const lvl = s.levels?.[key];\n            if (lvl?.visible === false) continue;\n\n            const levelPrice = p3.price + level * priceMove;\n            const y = scale.yToPixel(levelPrice, priceRange, chartH);\n            const baseColor = lvl?.color ?? s.strokeColor ?? FIB_EXT_FALLBACK_COLORS[i];\n            const color = hexWithAlpha(baseColor, isSelected ? 0.8 : 0.6);\n\n            ctx.strokeStyle = color;\n            applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, baseLineWidth);\n            ctx.beginPath();\n            ctx.moveTo(xMin, y);\n            ctx.lineTo(xMax, y);\n            ctx.stroke();\n            ctx.setLineDash([]);\n\n            const pct = `${(level * 100).toFixed(1)}%`;\n            const lbl = `${pct}  ${levelPrice.toFixed(pricePrecision)}`;\n            ctx.fillStyle = color;\n            ctx.fillText(lbl, xMin + 4, y - 3);\n        }\n\n        // Anchor dots at p1, p2, p3\n        for (const [ax, ay] of [[x1, y1], [x2, y2], [x3, y3]] as [number, number][]) {\n            ctx.beginPath();\n            ctx.arc(ax, ay, isSelected ? 4 : 3, 0, Math.PI * 2);\n            ctx.fillStyle = anchorColor;\n            ctx.fill();\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        _x: number,\n        y: number,\n        scale: ScaleManager,\n        _viewport: Viewport,\n        priceRange: PriceRange,\n        _chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 3) return false;\n        const [p1, p2, p3] = this.points;\n        const priceMove = p2.price - p1.price;\n\n        for (const level of FIB_EXT_LEVELS) {\n            const levelPrice = p3.price + level * priceMove;\n            const lineY = scale.yToPixel(levelPrice, priceRange, chartH);\n            if (Math.abs(y - lineY) <= HIT_TOLERANCE) return true;\n        }\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 3) return null;\n        const anchors = this.points.map(p => ({\n            px: scale.xToPixel(p.barIndex, viewport, chartW),\n            py: scale.yToPixel(p.price, priceRange, chartH),\n        }));\n        for (let i = 0; i < anchors.length; i++) {\n            if (Math.hypot(x - anchors[i].px, y - anchors[i].py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nconst FIB_LEVELS = [0, 0.236, 0.382, 0.5, 0.618, 0.786, 1.0];\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class FibChannel implements IDrawing {\n    readonly id: string;\n    readonly type = 'fibChannel' as const;\n    readonly requiredPoints = 3;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `fchann_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision = 2,\n        theme?: ChartTheme,\n    ): void {\n        const [p1, p2, p3] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const s = resolveStyle('fibChannel', this.style, theme);\n        const connectorColor = hexWithAlpha(s.strokeColor, 0.67);\n\n        // Phase 1 preview: show the base line (p1→p2) being defined\n        if (!p3) {\n            ctx.save();\n            ctx.strokeStyle = connectorColor;\n            ctx.lineWidth = 1;\n            ctx.setLineDash([4, 3]);\n            ctx.beginPath();\n            ctx.moveTo(x1, y1);\n            ctx.lineTo(x2, y2);\n            ctx.stroke();\n            ctx.setLineDash([]);\n            ctx.fillStyle = s.strokeColor;\n            ctx.beginPath();\n            ctx.arc(x1, y1, 3, 0, Math.PI * 2);\n            ctx.fill();\n            ctx.restore();\n            return;\n        }\n\n        const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n        const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n        // Direction vector of the base line p1->p2\n        const dx = x2 - x1;\n        const dy = y2 - y1;\n        const len = Math.hypot(dx, dy);\n        if (len === 0) return;\n\n        // Unit normal (perpendicular) to the base line\n        const nx = -dy / len;\n        const ny = dx / len;\n\n        // Perpendicular distance of p3 from the base line\n        const perpDist = (x3 - x1) * nx + (y3 - y1) * ny;\n\n        const baseLineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n\n        ctx.save();\n        ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n        ctx.lineWidth = baseLineWidth;\n\n        for (let i = 0; i < FIB_LEVELS.length; i++) {\n            const level = FIB_LEVELS[i];\n            const offset = level * perpDist;\n            const lx1 = x1 + offset * nx;\n            const ly1 = y1 + offset * ny;\n            const lx2 = x2 + offset * nx;\n            const ly2 = y2 + offset * ny;\n\n            const color = hexWithAlpha(s.strokeColor, isSelected ? 0.8 : 0.6);\n\n            ctx.strokeStyle = color;\n            applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, baseLineWidth);\n            ctx.beginPath();\n            ctx.moveTo(lx1, ly1);\n            ctx.lineTo(lx2, ly2);\n            ctx.stroke();\n            ctx.setLineDash([]);\n\n            const pct = `${(level * 100).toFixed(1)}%`;\n            ctx.fillStyle = color;\n            ctx.fillText(pct, lx2 + 4, ly2 + 3);\n        }\n\n        // Anchor dot at p3 (the width-defining point)\n        ctx.beginPath();\n        ctx.arc(x3, y3, isSelected ? 4 : 3, 0, Math.PI * 2);\n        ctx.fillStyle = s.strokeColor;\n        ctx.fill();\n\n        // Anchor dots at p1 and p2\n        for (const [ax, ay] of [[x1, y1], [x2, y2]] as [number, number][]) {\n            ctx.beginPath();\n            ctx.arc(ax, ay, isSelected ? 4 : 3, 0, Math.PI * 2);\n            ctx.fillStyle = s.strokeColor;\n            ctx.fill();\n        }\n\n        // Dashed guide line from base line to p3\n        ctx.strokeStyle = connectorColor;\n        ctx.setLineDash([3, 3]);\n        ctx.beginPath();\n        ctx.moveTo(x1, y1);\n        ctx.lineTo(x3, y3);\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 3) return false;\n        const [p1, p2, p3] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n        const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n        const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n        const dx = x2 - x1;\n        const dy = y2 - y1;\n        const len = Math.hypot(dx, dy);\n        if (len === 0) return false;\n\n        const nx = -dy / len;\n        const ny = dx / len;\n        const perpDist = (x3 - x1) * nx + (y3 - y1) * ny;\n\n        for (const level of FIB_LEVELS) {\n            const offset = level * perpDist;\n            const lx1 = x1 + offset * nx;\n            const ly1 = y1 + offset * ny;\n            const lx2 = x2 + offset * nx;\n            const ly2 = y2 + offset * ny;\n            if (pointToSegmentDist(x, y, lx1, ly1, lx2, ly2) <= HIT_TOLERANCE) return true;\n        }\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 3) return null;\n        const anchors = this.points.map(p => ({\n            px: scale.xToPixel(p.barIndex, viewport, chartW),\n            py: scale.yToPixel(p.price, priceRange, chartH),\n        }));\n        for (let i = 0; i < anchors.length; i++) {\n            if (Math.hypot(x - anchors[i].px, y - anchors[i].py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nconst FIB_NUMBERS = [1, 2, 3, 5, 8, 13, 21, 34, 55, 89];\n\nexport class FibTimezone implements IDrawing {\n    readonly id: string;\n    readonly type = 'fibTimezone' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `ftz_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const interval = p2.barIndex - p1.barIndex;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n\n        const s = resolveStyle('fibTimezone', this.style, theme);\n        const baseLineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        const lineColor = hexWithAlpha(s.strokeColor, isSelected ? 0.8 : 0.53);\n\n        ctx.save();\n        ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n        ctx.lineWidth = baseLineWidth;\n\n        // Draw the base interval line (p1 to p2)\n        ctx.strokeStyle = lineColor;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, baseLineWidth);\n        ctx.beginPath();\n        ctx.moveTo(x1, 0);\n        ctx.lineTo(x1, chartH);\n        ctx.stroke();\n        ctx.beginPath();\n        ctx.moveTo(x2, 0);\n        ctx.lineTo(x2, chartH);\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        // Draw Fibonacci vertical lines\n        for (const fib of FIB_NUMBERS) {\n            const barIndex = p1.barIndex + fib * interval;\n            const xFib = scale.xToPixel(barIndex, viewport, chartW);\n\n            // Skip lines outside the visible area\n            if (xFib < -50 || xFib > chartW + 50) continue;\n\n            ctx.strokeStyle = lineColor;\n            applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, baseLineWidth);\n            ctx.beginPath();\n            ctx.moveTo(xFib, 0);\n            ctx.lineTo(xFib, chartH);\n            ctx.stroke();\n            ctx.setLineDash([]);\n\n            ctx.fillStyle = lineColor;\n            ctx.fillText(String(fib), xFib + 3, 12);\n        }\n\n        // Anchor dots at p1 and p2\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n        for (const [ax, ay] of [[x1, y1], [x2, y2]] as [number, number][]) {\n            ctx.beginPath();\n            ctx.arc(ax, ay, isSelected ? 4 : 3, 0, Math.PI * 2);\n            ctx.fillStyle = s.strokeColor;\n            ctx.fill();\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        _y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        _priceRange: PriceRange,\n        chartW: number,\n        _chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2] = this.points;\n        const interval = p2.barIndex - p1.barIndex;\n\n        // Check p1 base line\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        if (Math.abs(x - x1) <= HIT_TOLERANCE) return true;\n\n        for (const fib of FIB_NUMBERS) {\n            const barIndex = p1.barIndex + fib * interval;\n            const xFib = scale.xToPixel(barIndex, viewport, chartW);\n            if (Math.abs(x - xFib) <= HIT_TOLERANCE) return true;\n        }\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const anchors = [\n            { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n            { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n        ];\n        for (let i = 0; i < anchors.length; i++) {\n            if (Math.hypot(x - anchors[i].px, y - anchors[i].py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nconst FIB_RATIOS = [0.236, 0.382, 0.5, 0.618, 0.786, 1.0, 1.618, 2.618];\n\nexport class FibCircles implements IDrawing {\n    readonly id: string;\n    readonly type = 'fibCircles' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `fcirc_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const cx = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const cy = scale.yToPixel(p1.price, priceRange, chartH);\n        const rx = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const ry = scale.yToPixel(p2.price, priceRange, chartH);\n        const baseRadius = Math.hypot(rx - cx, ry - cy);\n\n        const s = resolveStyle('fibCircles', this.style, theme);\n        const baseLineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n\n        ctx.save();\n        ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n        ctx.lineWidth = baseLineWidth;\n\n        for (let i = 0; i < FIB_RATIOS.length; i++) {\n            const ratio = FIB_RATIOS[i];\n            const radius = ratio * baseRadius;\n            const color = hexWithAlpha(s.strokeColor, isSelected ? 0.8 : 0.53);\n\n            ctx.strokeStyle = color;\n            applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, baseLineWidth);\n            ctx.beginPath();\n            ctx.arc(cx, cy, radius, 0, Math.PI * 2);\n            ctx.stroke();\n            ctx.setLineDash([]);\n\n            // Label at top of each circle\n            ctx.fillStyle = color;\n            ctx.fillText(`${(ratio * 100).toFixed(1)}%`, cx + 3, cy - radius + 12);\n        }\n\n        // Anchor dot at center (p1)\n        ctx.beginPath();\n        ctx.arc(cx, cy, isSelected ? 4 : 3, 0, Math.PI * 2);\n        ctx.fillStyle = s.strokeColor;\n        ctx.fill();\n\n        // Anchor dot at radius point (p2)\n        ctx.beginPath();\n        ctx.arc(rx, ry, isSelected ? 4 : 3, 0, Math.PI * 2);\n        ctx.fillStyle = s.strokeColor;\n        ctx.fill();\n\n        // Line from center to radius point\n        ctx.strokeStyle = hexWithAlpha(s.strokeColor, 0.4);\n        ctx.setLineDash([3, 3]);\n        ctx.beginPath();\n        ctx.moveTo(cx, cy);\n        ctx.lineTo(rx, ry);\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2] = this.points;\n        const cx = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const cy = scale.yToPixel(p1.price, priceRange, chartH);\n        const rx = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const ry = scale.yToPixel(p2.price, priceRange, chartH);\n        const baseRadius = Math.hypot(rx - cx, ry - cy);\n        const distFromCenter = Math.hypot(x - cx, y - cy);\n\n        for (const ratio of FIB_RATIOS) {\n            const radius = ratio * baseRadius;\n            if (Math.abs(distFromCenter - radius) <= HIT_TOLERANCE) return true;\n        }\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const p1x = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n        const p1y = scale.yToPixel(this.points[0].price, priceRange, chartH);\n        const p2x = scale.xToPixel(this.points[1].barIndex, viewport, chartW);\n        const p2y = scale.yToPixel(this.points[1].price, priceRange, chartH);\n\n        if (Math.hypot(x - p1x, y - p1y) <= HIT_TOLERANCE + 2) {\n            return { pointIndex: 0, cursor: 'move' };\n        }\n        if (Math.hypot(x - p2x, y - p2y) <= HIT_TOLERANCE + 2) {\n            return { pointIndex: 1, cursor: 'grab' };\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\n// Fibonacci sequence multipliers for each quarter-circle arc radius\nconst FIB_SEQUENCE = [1, 1, 2, 3, 5, 8, 13, 21];\n\nexport class FibSpiral implements IDrawing {\n    readonly id: string;\n    readonly type = 'fibSpiral' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `fspi_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    /** Compute the pivot center and radius for each arc in the spiral */\n    private computeArcs(\n        cx: number, cy: number,\n        dx: number, dy: number,\n    ): Array<{ ox: number; oy: number; r: number; startAngle: number; endAngle: number }> {\n        const baseDist = Math.hypot(dx, dy);\n        // Largest fib number is 21; base unit = baseDist / 21\n        const unit = baseDist / FIB_SEQUENCE[FIB_SEQUENCE.length - 1];\n\n        // Start angle: direction from center to p2\n        const startAngle = Math.atan2(dy, dx);\n\n        const arcs: Array<{ ox: number; oy: number; r: number; startAngle: number; endAngle: number }> = [];\n\n        // We build the spiral by placing each arc's pivot at the corner of the previous rectangle.\n        // The golden spiral approximation: successive quarter arcs whose centers walk along\n        // the vertices of a shrinking (towards center) golden rectangle.\n        //\n        // Strategy: start from p2 direction, walk inward.\n        // Each arc i has radius = FIB_SEQUENCE[i] * unit.\n        // The pivot for arc i is offset from the previous pivot.\n\n        let pivotX = cx;\n        let pivotY = cy;\n        // Rotation direction: counter-clockwise (positive math direction)\n        // Initial heading angle (from center to p2)\n        let angle = startAngle;\n\n        for (let i = FIB_SEQUENCE.length - 1; i >= 0; i--) {\n            const r = FIB_SEQUENCE[i] * unit;\n            const arcStart = angle + Math.PI;     // start drawing on the opposite side\n            const arcEnd = arcStart + Math.PI / 2; // quarter circle\n\n            arcs.unshift({ ox: pivotX, oy: pivotY, r, startAngle: arcStart, endAngle: arcEnd });\n\n            // Advance pivot for next (smaller) arc\n            // The next pivot is 90° rotated, at distance (r - nextR) from current pivot along current heading\n            if (i > 0) {\n                const nextR = FIB_SEQUENCE[i - 1] * unit;\n                // Move pivot along the direction perpendicular (left turn)\n                const perpAngle = angle - Math.PI / 2;\n                pivotX += (r - nextR) * Math.cos(perpAngle);\n                pivotY += (r - nextR) * Math.sin(perpAngle);\n                angle -= Math.PI / 2;\n            }\n        }\n\n        return arcs;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const cx = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const cy = scale.yToPixel(p1.price, priceRange, chartH);\n        const px2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const py2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const dx = px2 - cx;\n        const dy = py2 - cy;\n\n        const s = resolveStyle('fibSpiral', this.style, theme);\n        const baseLineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n\n        ctx.save();\n        ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n        ctx.strokeStyle = hexWithAlpha(s.strokeColor, isSelected ? 0.8 : 0.53);\n        ctx.lineWidth = baseLineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, baseLineWidth);\n\n        const arcs = this.computeArcs(cx, cy, dx, dy);\n\n        ctx.beginPath();\n        for (let i = 0; i < arcs.length; i++) {\n            const arc = arcs[i];\n            if (i === 0) {\n                const startX = arc.ox + arc.r * Math.cos(arc.startAngle);\n                const startY = arc.oy + arc.r * Math.sin(arc.startAngle);\n                ctx.moveTo(startX, startY);\n            }\n            ctx.arc(arc.ox, arc.oy, arc.r, arc.startAngle, arc.endAngle, false);\n        }\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        // Anchor dot at center (p1)\n        ctx.beginPath();\n        ctx.arc(cx, cy, isSelected ? 4 : 3, 0, Math.PI * 2);\n        ctx.fillStyle = s.strokeColor;\n        ctx.fill();\n\n        // Anchor dot at scale point (p2)\n        ctx.beginPath();\n        ctx.arc(px2, py2, isSelected ? 4 : 3, 0, Math.PI * 2);\n        ctx.fillStyle = s.strokeColor;\n        ctx.fill();\n\n        // Dashed line from center to p2\n        ctx.strokeStyle = hexWithAlpha(s.strokeColor, 0.4);\n        ctx.setLineDash([3, 3]);\n        ctx.beginPath();\n        ctx.moveTo(cx, cy);\n        ctx.lineTo(px2, py2);\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n\n        const [p1, p2] = this.points;\n        const cx = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const cy = scale.yToPixel(p1.price, priceRange, chartH);\n        const px2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const py2 = scale.yToPixel(p2.price, priceRange, chartH);\n        const dx = px2 - cx;\n        const dy = py2 - cy;\n\n        const arcs = this.computeArcs(cx, cy, dx, dy);\n        const SAMPLES = 16; // sample points per arc for hit testing\n\n        for (const arc of arcs) {\n            const angleSpan = arc.endAngle - arc.startAngle;\n            for (let s = 0; s <= SAMPLES; s++) {\n                const t = s / SAMPLES;\n                const a = arc.startAngle + t * angleSpan;\n                const sx = arc.ox + arc.r * Math.cos(a);\n                const sy = arc.oy + arc.r * Math.sin(a);\n                if (Math.hypot(x - sx, y - sy) <= HIT_TOLERANCE) return true;\n            }\n        }\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const p1x = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n        const p1y = scale.yToPixel(this.points[0].price, priceRange, chartH);\n        const p2x = scale.xToPixel(this.points[1].barIndex, viewport, chartW);\n        const p2y = scale.yToPixel(this.points[1].price, priceRange, chartH);\n\n        if (Math.hypot(x - p1x, y - p1y) <= HIT_TOLERANCE + 2) {\n            return { pointIndex: 0, cursor: 'move' };\n        }\n        if (Math.hypot(x - p2x, y - p2y) <= HIT_TOLERANCE + 2) {\n            return { pointIndex: 1, cursor: 'grab' };\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nconst FIB_FAN_RATIOS = [0.236, 0.382, 0.5, 0.618, 0.786];\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\n/** Extend a ray from (ox, oy) through (tx, ty) to the chart boundaries */\nfunction extendRay(\n    ox: number, oy: number,\n    tx: number, ty: number,\n    chartW: number, chartH: number,\n): [number, number] {\n    const dx = tx - ox;\n    const dy = ty - oy;\n    if (dx === 0 && dy === 0) return [tx, ty];\n\n    let tMin = Infinity;\n    // Right boundary\n    if (dx > 0) tMin = Math.min(tMin, (chartW - ox) / dx);\n    // Left boundary\n    if (dx < 0) tMin = Math.min(tMin, (0 - ox) / dx);\n    // Bottom boundary\n    if (dy > 0) tMin = Math.min(tMin, (chartH - oy) / dy);\n    // Top boundary\n    if (dy < 0) tMin = Math.min(tMin, (0 - oy) / dy);\n\n    return [ox + tMin * dx, oy + tMin * dy];\n}\n\nexport class FibFan implements IDrawing {\n    readonly id: string;\n    readonly type = 'fibFan' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `ffan_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const s = resolveStyle('fibFan', this.style, theme);\n        const baseLineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n\n        ctx.save();\n        ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n        ctx.lineWidth = baseLineWidth;\n\n        // Draw baseline p1→p2 faintly (dashed)\n        ctx.strokeStyle = hexWithAlpha(s.strokeColor, 0.67);\n        ctx.setLineDash([4, 3]);\n        ctx.beginPath();\n        ctx.moveTo(x1, y1);\n        ctx.lineTo(x2, y2);\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        const priceRange2 = p2.price - p1.price;\n\n        for (let i = 0; i < FIB_FAN_RATIOS.length; i++) {\n            const ratio = FIB_FAN_RATIOS[i];\n            const color = hexWithAlpha(s.strokeColor, isSelected ? 0.8 : 0.6);\n\n            // Fan target point: same barIndex as p2, price interpolated by ratio\n            const targetPrice = p1.price + ratio * priceRange2;\n            const tx = x2;\n            const ty = scale.yToPixel(targetPrice, priceRange, chartH);\n\n            // Extend from origin through target to chart edges\n            const [ex, ey] = extendRay(x1, y1, tx, ty, chartW, chartH);\n\n            ctx.strokeStyle = color;\n            applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, baseLineWidth);\n            ctx.beginPath();\n            ctx.moveTo(x1, y1);\n            ctx.lineTo(ex, ey);\n            ctx.stroke();\n            ctx.setLineDash([]);\n\n            // Label near the extended endpoint\n            ctx.fillStyle = color;\n            ctx.fillText(`${(ratio * 100).toFixed(1)}%`, Math.min(ex - 32, chartW - 40), ey - 3);\n        }\n\n        // Anchor dots at p1 and p2\n        for (const [ax, ay] of [[x1, y1], [x2, y2]] as [number, number][]) {\n            ctx.beginPath();\n            ctx.arc(ax, ay, isSelected ? 4 : 3, 0, Math.PI * 2);\n            ctx.fillStyle = s.strokeColor;\n            ctx.fill();\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const priceRange2 = p2.price - p1.price;\n\n        for (const ratio of FIB_FAN_RATIOS) {\n            const targetPrice = p1.price + ratio * priceRange2;\n            const tx = x2;\n            const ty = scale.yToPixel(targetPrice, priceRange, chartH);\n            const [ex, ey] = extendRay(x1, y1, tx, ty, chartW, chartH);\n            if (pointToSegmentDist(x, y, x1, y1, ex, ey) <= HIT_TOLERANCE) return true;\n        }\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const anchors = [\n            { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n            { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n        ];\n        for (let i = 0; i < anchors.length; i++) {\n            if (Math.hypot(x - anchors[i].px, y - anchors[i].py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nconst FIB_PROJ_LEVELS = [0, 0.618, 1, 1.272, 1.618, 2, 2.618];\nconst FIB_PROJ_FALLBACK_COLORS = ['#ef5350', '#26a69a', '#2196f3', '#26a69a', '#e8b84b', '#ef5350', '#ef5350'];\n\n\nexport class FibProjection implements IDrawing {\n    readonly id: string;\n    readonly type = 'fibProjection' as const;\n    readonly requiredPoints = 3;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `fproj_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        pricePrecision = 2,\n        theme?: ChartTheme,\n    ): void {\n        const [p1, p2, p3] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const s = resolveStyle('fibProjection', this.style, theme);\n        const anchorColor = s.strokeColor ?? '#e8b84b';\n        const connectorColor = hexWithAlpha(s.strokeColor ?? '#888888', 0.67);\n\n        // Phase 1 preview: show the swing (p1→p2) being defined\n        if (!p3) {\n            ctx.save();\n            ctx.strokeStyle = connectorColor;\n            ctx.lineWidth = 1;\n            ctx.setLineDash([4, 3]);\n            ctx.beginPath();\n            ctx.moveTo(x1, y1);\n            ctx.lineTo(x2, y2);\n            ctx.stroke();\n            ctx.setLineDash([]);\n            ctx.fillStyle = anchorColor;\n            ctx.beginPath();\n            ctx.arc(x1, y1, 3, 0, Math.PI * 2);\n            ctx.fill();\n            ctx.restore();\n            return;\n        }\n\n        const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n        const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n        const xMin = Math.min(x1, x3);\n        const xMax = Math.max(x1, x3);\n        const baseMove = p2.price - p1.price;\n        const baseLineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n\n        ctx.save();\n        ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n        ctx.lineWidth = baseLineWidth;\n\n        // Dashed connector lines: p1→p2 and p2→p3\n        ctx.strokeStyle = connectorColor;\n        ctx.setLineDash([4, 3]);\n        ctx.beginPath();\n        ctx.moveTo(x1, y1);\n        ctx.lineTo(x2, y2);\n        ctx.stroke();\n        ctx.beginPath();\n        ctx.moveTo(x2, y2);\n        ctx.lineTo(x3, y3);\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        // Projection level lines\n        for (let i = 0; i < FIB_PROJ_LEVELS.length; i++) {\n            const level = FIB_PROJ_LEVELS[i];\n            const key = String(level);\n            const lvl = s.levels?.[key];\n            if (lvl?.visible === false) continue;\n\n            const levelPrice = p3.price + level * baseMove;\n            const y = scale.yToPixel(levelPrice, priceRange, chartH);\n            const baseColor = lvl?.color ?? s.strokeColor ?? FIB_PROJ_FALLBACK_COLORS[i];\n            const color = hexWithAlpha(baseColor, isSelected ? 0.8 : 0.6);\n\n            ctx.strokeStyle = color;\n            applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, baseLineWidth);\n            ctx.beginPath();\n            ctx.moveTo(xMin, y);\n            ctx.lineTo(xMax, y);\n            ctx.stroke();\n            ctx.setLineDash([]);\n\n            const pct = `${(level * 100).toFixed(1)}%`;\n            const lbl = `${pct}  ${levelPrice.toFixed(pricePrecision)}`;\n            ctx.fillStyle = color;\n            ctx.fillText(lbl, xMin + 4, y - 3);\n        }\n\n        // Anchor dots at all 3 points\n        for (const [ax, ay] of [[x1, y1], [x2, y2], [x3, y3]] as [number, number][]) {\n            ctx.beginPath();\n            ctx.arc(ax, ay, isSelected ? 4 : 3, 0, Math.PI * 2);\n            ctx.fillStyle = anchorColor;\n            ctx.fill();\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        _x: number,\n        y: number,\n        scale: ScaleManager,\n        _viewport: Viewport,\n        priceRange: PriceRange,\n        _chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 3) return false;\n        const [p1, p2, p3] = this.points;\n        const baseMove = p2.price - p1.price;\n\n        for (const level of FIB_PROJ_LEVELS) {\n            const levelPrice = p3.price + level * baseMove;\n            const lineY = scale.yToPixel(levelPrice, priceRange, chartH);\n            if (Math.abs(y - lineY) <= HIT_TOLERANCE) return true;\n        }\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 3) return null;\n        const anchors = this.points.map(p => ({\n            px: scale.xToPixel(p.barIndex, viewport, chartW),\n            py: scale.yToPixel(p.price, priceRange, chartH),\n        }));\n        for (let i = 0; i < anchors.length; i++) {\n            if (Math.hypot(x - anchors[i].px, y - anchors[i].py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\n// Gann fan ratios as [priceUnits, timeUnits, label]\n// The 1:1 line is the base direction; other lines scale the y-component.\nconst GANN_RATIOS: [number, number, string][] = [\n    [1, 8, '1:8'],\n    [1, 4, '1:4'],\n    [1, 3, '1:3'],\n    [1, 2, '1:2'],\n    [1, 1, '1:1'],\n    [2, 1, '2:1'],\n    [3, 1, '3:1'],\n    [4, 1, '4:1'],\n    [8, 1, '8:1'],\n];\n\nexport class GannFan implements IDrawing {\n    readonly id: string;\n    readonly type = 'gannFan' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `gfan_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const baseWidth  = Math.abs(x2 - x1) || 1;\n        const baseHeight = y2 - y1; // signed: negative means price went up (y decreases)\n        const dirX = x2 > x1 ? 1 : -1;\n\n        const s = resolveStyle('gannFan', this.style, theme);\n\n        ctx.save();\n        ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        GANN_RATIOS.forEach(([priceUnits, timeUnits, label], idx) => {\n            // For the 1:1 line, scale factor = 1 (baseHeight / 1 * 1)\n            // For ratio priceUnits:timeUnits relative to 1:1:\n            //   scaleFactor = (priceUnits / 1) * (1 / timeUnits) = priceUnits / timeUnits\n            // But the reference 1:1 slope is baseHeight / baseWidth (per pixel).\n            // We scale the y-component by (priceUnits / timeUnits) relative to 1:1:\n            const scaleFactor = priceUnits / timeUnits;\n            const fanDY = baseHeight * scaleFactor;\n\n            // Line goes from (x1,y1) toward chartW\n            const tMax = (chartW - x1) / (baseWidth * dirX);\n            const xEnd = x1 + baseWidth * dirX * tMax;\n            const yEnd = y1 + fanDY * tMax;\n\n            // Opacity varies: center line (1:1) is fully opaque\n            const alphas = [0.33, 0.4, 0.47, 0.6, 0.8, 0.6, 0.47, 0.4, 0.33];\n            const a = alphas[idx] ?? 0.53;\n            const color = hexWithAlpha(s.strokeColor, a);\n\n            ctx.strokeStyle = color;\n            ctx.beginPath();\n            ctx.moveTo(x1, y1);\n            ctx.lineTo(xEnd, yEnd);\n            ctx.stroke();\n\n            // Label at the end of the line\n            ctx.fillStyle = color;\n            const labelX = Math.min(xEnd, chartW - 30);\n            ctx.fillText(label, labelX, yEnd - 3);\n        });\n\n        ctx.setLineDash([]);\n\n        // Anchor dots\n        ctx.fillStyle = s.strokeColor;\n        ctx.beginPath();\n        ctx.arc(x1, y1, isSelected ? 4 : 3, 0, Math.PI * 2);\n        ctx.fill();\n        ctx.beginPath();\n        ctx.arc(x2, y2, isSelected ? 4 : 3, 0, Math.PI * 2);\n        ctx.fill();\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const baseWidth  = Math.abs(x2 - x1) || 1;\n        const baseHeight = y2 - y1;\n        const dirX = x2 > x1 ? 1 : -1;\n\n        for (const [priceUnits, timeUnits] of GANN_RATIOS) {\n            const scaleFactor = priceUnits / timeUnits;\n            const fanDY = baseHeight * scaleFactor;\n            const tMax = (chartW - x1) / (baseWidth * dirX);\n            const xEnd = x1 + baseWidth * dirX * tMax;\n            const yEnd = y1 + fanDY * tMax;\n            if (pointToSegmentDist(x, y, x1, y1, xEnd, yEnd) <= HIT_TOLERANCE) return true;\n        }\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const pts = [\n            { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n            { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n        ];\n        const cursors = ['move', 'grab'];\n        for (let i = 0; i < pts.length; i++) {\n            if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: cursors[i] };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\nconst HIT_TOLERANCE = 6;\n\nexport class GannSquare implements IDrawing {\n    readonly id: string;\n    readonly type = 'gannSquare' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `gsq_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const left   = Math.min(x1, x2);\n        const top    = Math.min(y1, y2);\n        const right  = Math.max(x1, x2);\n        const bottom = Math.max(y1, y2);\n        const w = right - left;\n        const h = bottom - top;\n\n        const s = resolveStyle('gannSquare', this.style, theme);\n\n        ctx.save();\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        ctx.strokeStyle = s.strokeColor;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        // Light fill\n        ctx.fillStyle = hexWithAlpha(s.fillColor, s.fillOpacity);\n        ctx.fillRect(left, top, w, h);\n\n        // Border\n        ctx.strokeRect(left, top, w, h);\n\n        // 2 interior horizontal lines (at 1/3 and 2/3 height)\n        ctx.beginPath();\n        ctx.moveTo(left, top + h / 3);\n        ctx.lineTo(right, top + h / 3);\n        ctx.moveTo(left, top + (2 * h) / 3);\n        ctx.lineTo(right, top + (2 * h) / 3);\n        ctx.stroke();\n\n        // 2 interior vertical lines (at 1/3 and 2/3 width)\n        ctx.beginPath();\n        ctx.moveTo(left + w / 3, top);\n        ctx.lineTo(left + w / 3, bottom);\n        ctx.moveTo(left + (2 * w) / 3, top);\n        ctx.lineTo(left + (2 * w) / 3, bottom);\n        ctx.stroke();\n\n        ctx.setLineDash([]);\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const left   = Math.min(x1, x2);\n        const top    = Math.min(y1, y2);\n        const right  = Math.max(x1, x2);\n        const bottom = Math.max(y1, y2);\n\n        return x >= left && x <= right && y >= top && y <= bottom;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const pts = [\n            { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n            { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n        ];\n        for (let i = 0; i < pts.length; i++) {\n            if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'nwse-resize' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\nconst HIT_TOLERANCE = 6;\n\nexport class GannBox implements IDrawing {\n    readonly id: string;\n    readonly type = 'gannBox' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `gbox_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const left   = Math.min(x1, x2);\n        const top    = Math.min(y1, y2);\n        const right  = Math.max(x1, x2);\n        const bottom = Math.max(y1, y2);\n        const w = right - left;\n        const h = bottom - top;\n        const midX = left + w / 2;\n        const midY = top  + h / 2;\n\n        const s = resolveStyle('gannBox', this.style, theme);\n\n        ctx.save();\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        ctx.strokeStyle = s.strokeColor;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        // Light fill\n        ctx.fillStyle = hexWithAlpha(s.fillColor, s.fillOpacity);\n        ctx.fillRect(left, top, w, h);\n\n        // Border\n        ctx.strokeRect(left, top, w, h);\n\n        // Diagonal 1: top-left to bottom-right\n        ctx.beginPath();\n        ctx.moveTo(left, top);\n        ctx.lineTo(right, bottom);\n        ctx.stroke();\n\n        // Diagonal 2: top-right to bottom-left\n        ctx.beginPath();\n        ctx.moveTo(right, top);\n        ctx.lineTo(left, bottom);\n        ctx.stroke();\n\n        // Horizontal midline\n        ctx.beginPath();\n        ctx.moveTo(left, midY);\n        ctx.lineTo(right, midY);\n        ctx.stroke();\n\n        // Vertical midline\n        ctx.beginPath();\n        ctx.moveTo(midX, top);\n        ctx.lineTo(midX, bottom);\n        ctx.stroke();\n\n        ctx.setLineDash([]);\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const left   = Math.min(x1, x2);\n        const top    = Math.min(y1, y2);\n        const right  = Math.max(x1, x2);\n        const bottom = Math.max(y1, y2);\n\n        return x >= left && x <= right && y >= top && y <= bottom;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const pts = [\n            { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n            { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n        ];\n        for (let i = 0; i < pts.length; i++) {\n            if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'nwse-resize' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6; // px\n\nexport class Rectangle implements IDrawing {\n    readonly id: string;\n    readonly type = 'rectangle' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `rect_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const rx = Math.min(x1, x2);\n        const ry = Math.min(y1, y2);\n        const rw = Math.abs(x2 - x1);\n        const rh = Math.abs(y2 - y1);\n\n        const s = resolveStyle('rectangle', this.style, theme);\n\n        ctx.save();\n        ctx.fillStyle   = hexWithAlpha(s.fillColor, s.fillOpacity);\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth   = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n        ctx.fillRect(rx, ry, rw, rh);\n        ctx.strokeRect(rx, ry, rw, rh);\n        ctx.setLineDash([]);\n\n        // Corner handles when selected\n        if (isSelected) {\n            for (const [cx, cy] of [[x1, y1], [x2, y1], [x1, y2], [x2, y2]] as [number, number][]) {\n                ctx.beginPath();\n                ctx.arc(cx, cy, 3.5, 0, Math.PI * 2);\n                ctx.fillStyle = s.strokeColor;\n                ctx.fill();\n            }\n        }\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const rx = Math.min(x1, x2) - HIT_TOLERANCE;\n        const ry = Math.min(y1, y2) - HIT_TOLERANCE;\n        const rw = Math.abs(x2 - x1) + HIT_TOLERANCE * 2;\n        const rh = Math.abs(y2 - y1) + HIT_TOLERANCE * 2;\n\n        return x >= rx && x <= rx + rw && y >= ry && y <= ry + rh;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        // Only the 2 actual control points are interactive handles\n        // (the other 2 rendered corners are mixtures of both points' x/y — not directly movable)\n        const diag = x1 <= x2 ? (y1 <= y2 ? 'nwse-resize' : 'nesw-resize') : (y1 <= y2 ? 'nesw-resize' : 'nwse-resize');\n        const handles: [number, number, number, string][] = [\n            [0, x1, y1, diag],\n            [1, x2, y2, diag],\n        ];\n        for (const [pi, cx, cy, cursor] of handles) {\n            if (Math.hypot(x - cx, y - cy) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: pi as number, cursor };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\nconst HIT_TOLERANCE = 6;\n\nfunction pointInPolygon(px: number, py: number, poly: [number, number][]): boolean {\n    let inside = false;\n    const n = poly.length;\n    for (let i = 0, j = n - 1; i < n; j = i++) {\n        const [xi, yi] = poly[i];\n        const [xj, yj] = poly[j];\n        const intersect = ((yi > py) !== (yj > py)) &&\n            (px < (xj - xi) * (py - yi) / (yj - yi) + xi);\n        if (intersect) inside = !inside;\n    }\n    return inside;\n}\n\nexport class RotatedRectangle implements IDrawing {\n    readonly id: string;\n    readonly type = 'rotatedRectangle' as const;\n    readonly requiredPoints = 3;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `rrect_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    private getCorners(\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): [number, number][] {\n        const [p1, p2, p3] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n        const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n        const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n        const abLen = Math.hypot(x2 - x1, y2 - y1);\n        if (abLen < 1e-6) {\n            return [[x1, y1], [x2, y2], [x2, y2], [x1, y1]];\n        }\n\n        // Perpendicular unit vector (rotated 90° CCW)\n        const perpX = -(y2 - y1) / abLen;\n        const perpY =  (x2 - x1) / abLen;\n\n        // Signed width = projection of p3-p1 onto perp\n        const width = (x3 - x1) * perpX + (y3 - y1) * perpY;\n\n        // Corner A = p1, B = p2, C = B + perp*width, D = A + perp*width\n        const ax = x1, ay = y1;\n        const bx = x2, by = y2;\n        const cx = bx + perpX * width, cy = by + perpY * width;\n        const dx = ax + perpX * width, dy = ay + perpY * width;\n\n        return [[ax, ay], [bx, by], [cx, cy], [dx, dy]];\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 3) return;\n\n        const corners = this.getCorners(scale, viewport, priceRange, chartW, chartH);\n\n        const s = resolveStyle('rotatedRectangle', this.style, theme);\n\n        ctx.save();\n\n        // Filled polygon\n        ctx.beginPath();\n        ctx.moveTo(corners[0][0], corners[0][1]);\n        for (let i = 1; i < corners.length; i++) {\n            ctx.lineTo(corners[i][0], corners[i][1]);\n        }\n        ctx.closePath();\n        ctx.fillStyle = hexWithAlpha(s.fillColor, s.fillOpacity);\n        ctx.fill();\n\n        // Border\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        // Anchor dots at A, B, C, D\n        ctx.fillStyle = s.strokeColor;\n        for (const [x, y] of corners) {\n            ctx.beginPath();\n            ctx.arc(x, y, isSelected ? 4 : 3, 0, Math.PI * 2);\n            ctx.fill();\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 3) return false;\n        const corners = this.getCorners(scale, viewport, priceRange, chartW, chartH);\n        return pointInPolygon(x, y, corners);\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        // Expose p1 (index 0), p2 (index 1), p3 (index 2 — the width handle)\n        for (let i = 0; i < this.points.length; i++) {\n            const px = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n            const py = scale.yToPixel(this.points[i].price, priceRange, chartH);\n            if (Math.hypot(x - px, y - py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6; // px\n\nexport class Ellipse implements IDrawing {\n    readonly id: string;\n    readonly type = 'ellipse' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `ell_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const cx = (x1 + x2) / 2;\n        const cy = (y1 + y2) / 2;\n        const rx = Math.abs(x2 - x1) / 2;\n        const ry = Math.abs(y2 - y1) / 2;\n\n        if (rx < 1 || ry < 1) return;\n\n        const s = resolveStyle('ellipse', this.style, theme);\n\n        ctx.save();\n        ctx.fillStyle   = hexWithAlpha(s.fillColor, s.fillOpacity);\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth   = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        ctx.beginPath();\n        ctx.ellipse(cx, cy, rx, ry, 0, 0, Math.PI * 2);\n        ctx.fill();\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        if (isSelected) {\n            for (const [hx, hy] of [[x1, y1], [x2, y2]] as [number, number][]) {\n                ctx.beginPath();\n                ctx.arc(hx, hy, 3.5, 0, Math.PI * 2);\n                ctx.fillStyle = s.strokeColor;\n                ctx.fill();\n            }\n        }\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const cx = (x1 + x2) / 2;\n        const cy = (y1 + y2) / 2;\n        const rx = Math.abs(x2 - x1) / 2 + HIT_TOLERANCE;\n        const ry = Math.abs(y2 - y1) / 2 + HIT_TOLERANCE;\n\n        if (rx < 1 || ry < 1) return false;\n        const dx = (x - cx) / rx;\n        const dy = (y - cy) / ry;\n        return dx * dx + dy * dy <= 1;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const diag = x1 <= x2\n            ? (y1 <= y2 ? 'nwse-resize' : 'nesw-resize')\n            : (y1 <= y2 ? 'nesw-resize' : 'nwse-resize');\n        const handles: [number, number, number, string][] = [\n            [0, x1, y1, diag],\n            [1, x2, y2, diag],\n        ];\n        for (const [pi, hx, hy, cursor] of handles) {\n            if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: pi as number, cursor };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6; // px\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class Triangle implements IDrawing {\n    readonly id: string;\n    readonly type = 'triangle' as const;\n    readonly requiredPoints = 3;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `tri_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n\n        const s = resolveStyle('triangle', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth   = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        ctx.beginPath();\n        ctx.moveTo(px[0], py[0]);\n        for (let i = 1; i < px.length; i++) {\n            ctx.lineTo(px[i], py[i]);\n        }\n        if (this.complete) {\n            ctx.closePath();\n            ctx.fillStyle = hexWithAlpha(s.fillColor, s.fillOpacity);\n            ctx.fill();\n        }\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        if (isSelected) {\n            for (let i = 0; i < px.length; i++) {\n                ctx.beginPath();\n                ctx.arc(px[i], py[i], 4, 0, Math.PI * 2);\n                ctx.fillStyle = s.strokeColor;\n                ctx.fill();\n            }\n        }\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 3) return false;\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        const n = px.length;\n        for (let i = 0; i < n; i++) {\n            const j = (i + 1) % n;\n            if (pointToSegmentDist(x, y, px[i], py[i], px[j], py[j]) <= HIT_TOLERANCE) return true;\n        }\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 3) return null;\n        for (let i = 0; i < this.points.length; i++) {\n            const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n            const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n            if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6; // px\n\nexport class Circle implements IDrawing {\n    readonly id: string;\n    readonly type = 'circle' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `circ_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const cx = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const cy = scale.yToPixel(p1.price, priceRange, chartH);\n        const ex = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const ey = scale.yToPixel(p2.price, priceRange, chartH);\n        const r  = Math.hypot(ex - cx, ey - cy);\n\n        if (r < 1) return;\n\n        const s = resolveStyle('circle', this.style, theme);\n\n        ctx.save();\n        ctx.fillStyle   = hexWithAlpha(s.fillColor, s.fillOpacity);\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth   = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        ctx.beginPath();\n        ctx.arc(cx, cy, r, 0, Math.PI * 2);\n        ctx.fill();\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        if (isSelected) {\n            // Center handle\n            ctx.beginPath();\n            ctx.arc(cx, cy, 3, 0, Math.PI * 2);\n            ctx.fillStyle = s.strokeColor;\n            ctx.fill();\n            // Edge handle\n            ctx.beginPath();\n            ctx.arc(ex, ey, 3.5, 0, Math.PI * 2);\n            ctx.fillStyle = s.strokeColor;\n            ctx.fill();\n        }\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2] = this.points;\n        const cx = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const cy = scale.yToPixel(p1.price, priceRange, chartH);\n        const ex = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const ey = scale.yToPixel(p2.price, priceRange, chartH);\n        const r  = Math.hypot(ex - cx, ey - cy);\n        return Math.hypot(x - cx, y - cy) <= r + HIT_TOLERANCE;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const [p1, p2] = this.points;\n        const cx = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const cy = scale.yToPixel(p1.price, priceRange, chartH);\n        const ex = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const ey = scale.yToPixel(p2.price, priceRange, chartH);\n\n        if (Math.hypot(x - cx, y - cy) <= HIT_TOLERANCE + 2) {\n            return { pointIndex: 0, cursor: 'move' };\n        }\n        if (Math.hypot(x - ex, y - ey) <= HIT_TOLERANCE + 2) {\n            return { pointIndex: 1, cursor: 'grab' };\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class Arc implements IDrawing {\n    readonly id: string;\n    readonly type = 'arc' as const;\n    readonly requiredPoints = 3;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `arc_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 3) return;\n\n        const [p1, p2, p3] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n        const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n        const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n        const s = resolveStyle('arc', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        // Compute circumscribed circle through 3 points using perpendicular bisector method\n        const ax = x1, ay = y1;\n        const bx = x2, by = y2;\n        const cx = x3, cy = y3;\n\n        const D = 2 * (ax * (by - cy) + bx * (cy - ay) + cx * (ay - by));\n\n        if (Math.abs(D) < 1e-6) {\n            // Collinear — draw straight line\n            ctx.beginPath();\n            ctx.moveTo(x1, y1);\n            ctx.lineTo(x3, y3);\n            ctx.stroke();\n        } else {\n            const ax2 = ax * ax, ay2 = ay * ay;\n            const bx2 = bx * bx, by2 = by * by;\n            const cx2 = cx * cx, cy2 = cy * cy;\n\n            const ux = ((ax2 + ay2) * (by - cy) + (bx2 + by2) * (cy - ay) + (cx2 + cy2) * (ay - by)) / D;\n            const uy = ((ax2 + ay2) * (cx - bx) + (bx2 + by2) * (ax - cx) + (cx2 + cy2) * (bx - ax)) / D;\n\n            const r = Math.hypot(ax - ux, ay - uy);\n\n            // Angles from center to each point\n            const aStart = Math.atan2(ay - uy, ax - ux);\n            const aMid   = Math.atan2(by - uy, bx - ux);\n            const aEnd   = Math.atan2(cy - uy, cx - ux);\n\n            // Determine direction: counterclockwise if p2 is CCW between p1 and p3\n            const normalizeAngle = (a: number, base: number): number => {\n                let diff = a - base;\n                while (diff < 0) diff += Math.PI * 2;\n                while (diff >= Math.PI * 2) diff -= Math.PI * 2;\n                return diff;\n            };\n\n            const midFromStart = normalizeAngle(aMid, aStart);\n            const endFromStart = normalizeAngle(aEnd, aStart);\n\n            // If midFromStart < endFromStart, p2 is between p1→p3 going CCW\n            const anticlockwise = midFromStart > endFromStart;\n\n            ctx.beginPath();\n            ctx.arc(ux, uy, r, aStart, aEnd, anticlockwise);\n            ctx.stroke();\n        }\n\n        ctx.setLineDash([]);\n\n        // Anchor dots at all 3 points\n        const anchors: [number, number][] = [[x1, y1], [x2, y2], [x3, y3]];\n        ctx.fillStyle = s.strokeColor;\n        for (const [x, y] of anchors) {\n            ctx.beginPath();\n            ctx.arc(x, y, isSelected ? 4 : 3, 0, Math.PI * 2);\n            ctx.fill();\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 3) return false;\n\n        const [p1, p2, p3] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n        const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n        const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n        const ax = x1, ay = y1;\n        const bx = x2, by = y2;\n        const cx = x3, cy = y3;\n\n        const D = 2 * (ax * (by - cy) + bx * (cy - ay) + cx * (ay - by));\n\n        if (Math.abs(D) < 1e-6) {\n            return pointToSegmentDist(x, y, x1, y1, x3, y3) <= HIT_TOLERANCE;\n        }\n\n        const ax2 = ax * ax, ay2 = ay * ay;\n        const bx2 = bx * bx, by2 = by * by;\n        const cx2 = cx * cx, cy2 = cy * cy;\n\n        const ux = ((ax2 + ay2) * (by - cy) + (bx2 + by2) * (cy - ay) + (cx2 + cy2) * (ay - by)) / D;\n        const uy = ((ax2 + ay2) * (cx - bx) + (bx2 + by2) * (ax - cx) + (cx2 + cy2) * (bx - ax)) / D;\n\n        const r = Math.hypot(ax - ux, ay - uy);\n        const dist = Math.abs(Math.hypot(x - ux, y - uy) - r);\n\n        if (dist > HIT_TOLERANCE) return false;\n\n        // Also verify the hit point is on the correct arc segment\n        const aStart = Math.atan2(ay - uy, ax - ux);\n        const aMid   = Math.atan2(by - uy, bx - ux);\n        const aEnd   = Math.atan2(cy - uy, cx - ux);\n        const aHit   = Math.atan2(y - uy, x - ux);\n\n        const normalizeAngle = (a: number, base: number): number => {\n            let diff = a - base;\n            while (diff < 0) diff += Math.PI * 2;\n            while (diff >= Math.PI * 2) diff -= Math.PI * 2;\n            return diff;\n        };\n\n        const midFromStart = normalizeAngle(aMid, aStart);\n        const endFromStart = normalizeAngle(aEnd, aStart);\n        const hitFromStart = normalizeAngle(aHit, aStart);\n\n        const anticlockwise = midFromStart > endFromStart;\n\n        if (!anticlockwise) {\n            return hitFromStart <= endFromStart;\n        } else {\n            return hitFromStart >= endFromStart || hitFromStart <= 0;\n        }\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        for (let i = 0; i < this.points.length; i++) {\n            const px = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n            const py = scale.yToPixel(this.points[i].price, priceRange, chartH);\n            if (Math.hypot(x - px, y - py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class Polyline implements IDrawing {\n    readonly id: string;\n    readonly type = 'polyline' as const;\n    readonly openEnded = true;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `poly_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const pixelPts = this.points.map(p => ({\n            x: scale.xToPixel(p.barIndex, viewport, chartW),\n            y: scale.yToPixel(p.price, priceRange, chartH),\n        }));\n\n        const s = resolveStyle('polyline', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n\n        // Draw confirmed segments (all except the last when not complete)\n        const solidCount = this.complete ? pixelPts.length : pixelPts.length - 1;\n\n        if (solidCount >= 2) {\n            applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n            ctx.beginPath();\n            ctx.moveTo(pixelPts[0].x, pixelPts[0].y);\n            for (let i = 1; i < solidCount; i++) {\n                ctx.lineTo(pixelPts[i].x, pixelPts[i].y);\n            }\n            ctx.stroke();\n            ctx.setLineDash([]);\n        }\n\n        // Draw the preview (last) segment as dashed when not complete\n        if (!this.complete && pixelPts.length >= 2) {\n            const last = pixelPts.length - 1;\n            ctx.setLineDash([4, 4]);\n            ctx.beginPath();\n            ctx.moveTo(pixelPts[last - 1].x, pixelPts[last - 1].y);\n            ctx.lineTo(pixelPts[last].x, pixelPts[last].y);\n            ctx.stroke();\n            ctx.setLineDash([]);\n        }\n\n        // Anchor dots at confirmed points\n        ctx.fillStyle = s.strokeColor;\n        const dotCount = this.complete ? pixelPts.length : pixelPts.length - 1;\n        for (let i = 0; i < dotCount; i++) {\n            ctx.beginPath();\n            ctx.arc(pixelPts[i].x, pixelPts[i].y, isSelected ? 4 : 3, 0, Math.PI * 2);\n            ctx.fill();\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n\n        const pixelPts = this.points.map(p => ({\n            x: scale.xToPixel(p.barIndex, viewport, chartW),\n            y: scale.yToPixel(p.price, priceRange, chartH),\n        }));\n\n        const segCount = this.complete ? pixelPts.length - 1 : pixelPts.length - 2;\n        for (let i = 0; i < segCount; i++) {\n            if (pointToSegmentDist(x, y, pixelPts[i].x, pixelPts[i].y, pixelPts[i + 1].x, pixelPts[i + 1].y) <= HIT_TOLERANCE) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        for (let i = 0; i < this.points.length; i++) {\n            const px = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n            const py = scale.yToPixel(this.points[i].price, priceRange, chartH);\n            if (Math.hypot(x - px, y - py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class Path implements IDrawing {\n    readonly id: string;\n    readonly type = 'path' as const;\n    readonly openEnded = true;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `path_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const pixelPts = this.points.map(p => ({\n            x: scale.xToPixel(p.barIndex, viewport, chartW),\n            y: scale.yToPixel(p.price, priceRange, chartH),\n        }));\n\n        // Solid points: all confirmed points (exclude preview when !complete)\n        const solidCount = this.complete ? pixelPts.length : pixelPts.length - 1;\n\n        const s = resolveStyle('path', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n\n        // Draw smooth bezier curve through confirmed points using quadratic Catmull-Rom style\n        if (solidCount >= 2) {\n            applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n            ctx.beginPath();\n            ctx.moveTo(pixelPts[0].x, pixelPts[0].y);\n\n            if (solidCount === 2) {\n                ctx.lineTo(pixelPts[1].x, pixelPts[1].y);\n            } else {\n                // Quadratic smooth: for each interior control point, draw to midpoint\n                for (let i = 1; i < solidCount - 1; i++) {\n                    const midX = (pixelPts[i].x + pixelPts[i + 1].x) / 2;\n                    const midY = (pixelPts[i].y + pixelPts[i + 1].y) / 2;\n                    ctx.quadraticCurveTo(pixelPts[i].x, pixelPts[i].y, midX, midY);\n                }\n                // Final segment to last confirmed point\n                ctx.lineTo(pixelPts[solidCount - 1].x, pixelPts[solidCount - 1].y);\n            }\n            ctx.stroke();\n            ctx.setLineDash([]);\n        }\n\n        // Draw preview (last) segment as dashed line when not complete\n        if (!this.complete && pixelPts.length >= 2) {\n            const last = pixelPts.length - 1;\n            ctx.setLineDash([4, 4]);\n            ctx.beginPath();\n            ctx.moveTo(pixelPts[last - 1].x, pixelPts[last - 1].y);\n            ctx.lineTo(pixelPts[last].x, pixelPts[last].y);\n            ctx.stroke();\n            ctx.setLineDash([]);\n        }\n\n        // Anchor dots at confirmed points\n        ctx.fillStyle = s.strokeColor;\n        for (let i = 0; i < solidCount; i++) {\n            ctx.beginPath();\n            ctx.arc(pixelPts[i].x, pixelPts[i].y, isSelected ? 4 : 3, 0, Math.PI * 2);\n            ctx.fill();\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n\n        const pixelPts = this.points.map(p => ({\n            x: scale.xToPixel(p.barIndex, viewport, chartW),\n            y: scale.yToPixel(p.price, priceRange, chartH),\n        }));\n\n        // Approximate hit test using line segments between confirmed points\n        const segCount = this.complete ? pixelPts.length - 1 : pixelPts.length - 2;\n        for (let i = 0; i < segCount; i++) {\n            if (pointToSegmentDist(x, y, pixelPts[i].x, pixelPts[i].y, pixelPts[i + 1].x, pixelPts[i + 1].y) <= HIT_TOLERANCE) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        for (let i = 0; i < this.points.length; i++) {\n            const px = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n            const py = scale.yToPixel(this.points[i].price, priceRange, chartH);\n            if (Math.hypot(x - px, y - py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange as IPriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\nconst HIT_TOLERANCE = 6;\n\nfunction drawArrowhead(ctx: CanvasRenderingContext2D, fromX: number, fromY: number, toX: number, toY: number, size = 7): void {\n    const angle = Math.atan2(toY - fromY, toX - fromX);\n    ctx.beginPath();\n    ctx.moveTo(toX, toY);\n    ctx.lineTo(toX - size * Math.cos(angle - Math.PI / 6), toY - size * Math.sin(angle - Math.PI / 6));\n    ctx.lineTo(toX - size * Math.cos(angle + Math.PI / 6), toY - size * Math.sin(angle + Math.PI / 6));\n    ctx.closePath();\n    ctx.fill();\n}\n\nexport class PriceRange implements IDrawing {\n    readonly id: string;\n    readonly type = 'priceRange' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `pr_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: IPriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        pricePrecision = 2,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const midX   = (x1 + x2) / 2;\n        const midY   = (y1 + y2) / 2;\n        const topY   = Math.min(y1, y2);\n        const botY   = Math.max(y1, y2);\n        const tickHalf = 10;\n\n        const s = resolveStyle('priceRange', this.style, theme);\n        const color = s.strokeColor;\n\n        ctx.save();\n        ctx.strokeStyle = color;\n        ctx.fillStyle   = color;\n        ctx.lineWidth   = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n        ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n\n        // Vertical line (arrow shaft)\n        ctx.beginPath();\n        ctx.moveTo(midX, topY);\n        ctx.lineTo(midX, botY);\n        ctx.stroke();\n\n        // Arrowheads\n        drawArrowhead(ctx, midX, botY, midX, topY); // pointing up\n        drawArrowhead(ctx, midX, topY, midX, botY); // pointing down\n\n        // Horizontal tick at y1\n        ctx.beginPath();\n        ctx.moveTo(x1 - tickHalf, y1);\n        ctx.lineTo(x1 + tickHalf, y1);\n        ctx.stroke();\n\n        // Horizontal tick at y2\n        ctx.beginPath();\n        ctx.moveTo(x2 - tickHalf, y2);\n        ctx.lineTo(x2 + tickHalf, y2);\n        ctx.stroke();\n\n        ctx.setLineDash([]);\n\n        // Label box at midpoint\n        const priceDiff  = Math.abs(p1.price - p2.price).toFixed(pricePrecision);\n        const pctChange  = ((p2.price - p1.price) / p1.price * 100).toFixed(2) + '%';\n        const line1 = priceDiff;\n        const line2 = pctChange;\n\n        const boxPad = 4;\n        const boxW   = 70;\n        const boxH   = 30;\n        const boxX   = midX + 8;\n        const boxY   = midY - boxH / 2;\n\n        ctx.fillStyle = hexWithAlpha(s.fillColor, s.fillOpacity);\n        ctx.fillRect(boxX, boxY, boxW, boxH);\n        ctx.strokeStyle = color;\n        ctx.strokeRect(boxX, boxY, boxW, boxH);\n\n        ctx.fillStyle = color;\n        ctx.fillText(line1, boxX + boxPad, boxY + boxPad + 10);\n        ctx.fillText(line2, boxX + boxPad, boxY + boxPad + 22);\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: IPriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n        const midX = (x1 + x2) / 2;\n        const topY = Math.min(y1, y2);\n        const botY = Math.max(y1, y2);\n        return Math.abs(x - midX) <= HIT_TOLERANCE && y >= topY && y <= botY;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: IPriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const pts = [\n            { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n            { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n        ];\n        for (let i = 0; i < pts.length; i++) {\n            if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'ns-resize' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\nconst HIT_TOLERANCE = 6;\n\nfunction drawArrowhead(ctx: CanvasRenderingContext2D, fromX: number, fromY: number, toX: number, toY: number, size = 7): void {\n    const angle = Math.atan2(toY - fromY, toX - fromX);\n    ctx.beginPath();\n    ctx.moveTo(toX, toY);\n    ctx.lineTo(toX - size * Math.cos(angle - Math.PI / 6), toY - size * Math.sin(angle - Math.PI / 6));\n    ctx.lineTo(toX - size * Math.cos(angle + Math.PI / 6), toY - size * Math.sin(angle + Math.PI / 6));\n    ctx.closePath();\n    ctx.fill();\n}\n\nexport class DateRange implements IDrawing {\n    readonly id: string;\n    readonly type = 'dateRange' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `dr_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const midY     = (y1 + y2) / 2;\n        const leftX    = Math.min(x1, x2);\n        const rightX   = Math.max(x1, x2);\n        const tickHalf = 10;\n\n        const s = resolveStyle('dateRange', this.style, theme);\n        const color = s.strokeColor;\n\n        ctx.save();\n        ctx.strokeStyle = color;\n        ctx.fillStyle   = color;\n        ctx.lineWidth   = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n        ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n\n        // Horizontal arrow shaft\n        ctx.beginPath();\n        ctx.moveTo(leftX, midY);\n        ctx.lineTo(rightX, midY);\n        ctx.stroke();\n\n        // Arrowheads\n        drawArrowhead(ctx, rightX, midY, leftX, midY); // pointing left\n        drawArrowhead(ctx, leftX, midY, rightX, midY); // pointing right\n\n        // Vertical tick at x1\n        ctx.beginPath();\n        ctx.moveTo(x1, y1 - tickHalf);\n        ctx.lineTo(x1, y1 + tickHalf);\n        ctx.stroke();\n\n        // Vertical tick at x2\n        ctx.beginPath();\n        ctx.moveTo(x2, y2 - tickHalf);\n        ctx.lineTo(x2, y2 + tickHalf);\n        ctx.stroke();\n\n        ctx.setLineDash([]);\n\n        // Label: bar count above the arrow\n        const barCount = Math.abs(p2.barIndex - p1.barIndex);\n        const label    = `${barCount} bars`;\n        const midX     = (x1 + x2) / 2;\n        const textW    = ctx.measureText(label).width;\n\n        ctx.fillStyle = color;\n        ctx.fillText(label, midX - textW / 2, midY - 10);\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n        const midY  = (y1 + y2) / 2;\n        const leftX = Math.min(x1, x2);\n        const rightX = Math.max(x1, x2);\n        return Math.abs(y - midY) <= HIT_TOLERANCE && x >= leftX && x <= rightX;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const pts = [\n            { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n            { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n        ];\n        for (let i = 0; i < pts.length; i++) {\n            if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'ew-resize' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\nconst HIT_TOLERANCE = 6;\n\nfunction drawArrowhead(ctx: CanvasRenderingContext2D, fromX: number, fromY: number, toX: number, toY: number, size = 7): void {\n    const angle = Math.atan2(toY - fromY, toX - fromX);\n    ctx.beginPath();\n    ctx.moveTo(toX, toY);\n    ctx.lineTo(toX - size * Math.cos(angle - Math.PI / 6), toY - size * Math.sin(angle - Math.PI / 6));\n    ctx.lineTo(toX - size * Math.cos(angle + Math.PI / 6), toY - size * Math.sin(angle + Math.PI / 6));\n    ctx.closePath();\n    ctx.fill();\n}\n\nexport class DatePriceRange implements IDrawing {\n    readonly id: string;\n    readonly type = 'datePriceRange' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `dpr_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        pricePrecision = 2,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const left   = Math.min(x1, x2);\n        const top    = Math.min(y1, y2);\n        const right  = Math.max(x1, x2);\n        const bottom = Math.max(y1, y2);\n        const w = right - left;\n        const h = bottom - top;\n\n        const s = resolveStyle('datePriceRange', this.style, theme);\n        const color = s.strokeColor;\n\n        ctx.save();\n        ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n\n        // Light fill\n        ctx.fillStyle = hexWithAlpha(s.fillColor, s.fillOpacity);\n        ctx.fillRect(left, top, w, h);\n\n        // Dashed border\n        ctx.strokeStyle = color;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n        ctx.strokeRect(left, top, w, h);\n        ctx.setLineDash([]);\n\n        // Diagonal arrow from p1 corner to p2 corner\n        ctx.strokeStyle = color;\n        ctx.fillStyle   = color;\n        ctx.beginPath();\n        ctx.moveTo(x1, y1);\n        ctx.lineTo(x2, y2);\n        ctx.stroke();\n        drawArrowhead(ctx, x1, y1, x2, y2);\n\n        // Price range label on the right side\n        const priceRangeVal = Math.abs(p1.price - p2.price).toFixed(pricePrecision);\n        const priceLabel    = `\\u0394${priceRangeVal}`;\n        ctx.fillStyle = color;\n        ctx.fillText(priceLabel, right + 4, (top + bottom) / 2);\n\n        // Bar count label at the bottom\n        const barCount  = Math.abs(p2.barIndex - p1.barIndex);\n        const barLabel  = `${barCount} bars`;\n        const textW     = ctx.measureText(barLabel).width;\n        ctx.fillText(barLabel, left + w / 2 - textW / 2, bottom + 12);\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const left   = Math.min(x1, x2) - HIT_TOLERANCE;\n        const top    = Math.min(y1, y2) - HIT_TOLERANCE;\n        const right  = Math.max(x1, x2) + HIT_TOLERANCE;\n        const bottom = Math.max(y1, y2) + HIT_TOLERANCE;\n\n        return x >= left && x <= right && y >= top && y <= bottom;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const pts = [\n            { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n            { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n        ];\n        for (let i = 0; i < pts.length; i++) {\n            if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'nwse-resize' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class Ruler implements IDrawing {\n    readonly id: string;\n    readonly type = 'ruler' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `rul_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        pricePrecision = 2,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const s = resolveStyle('ruler', this.style, theme);\n        const color = s.strokeColor;\n        const angle = Math.atan2(y2 - y1, x2 - x1);\n        const perpAngle = angle + Math.PI / 2;\n        const tickLen = 8;\n\n        ctx.save();\n        ctx.strokeStyle = color;\n        ctx.fillStyle   = color;\n        ctx.lineWidth   = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n        ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n\n        // Main line\n        ctx.beginPath();\n        ctx.moveTo(x1, y1);\n        ctx.lineTo(x2, y2);\n        ctx.stroke();\n\n        // Perpendicular tick at p1\n        ctx.beginPath();\n        ctx.moveTo(x1 - tickLen * Math.cos(perpAngle), y1 - tickLen * Math.sin(perpAngle));\n        ctx.lineTo(x1 + tickLen * Math.cos(perpAngle), y1 + tickLen * Math.sin(perpAngle));\n        ctx.stroke();\n\n        // Perpendicular tick at p2\n        ctx.beginPath();\n        ctx.moveTo(x2 - tickLen * Math.cos(perpAngle), y2 - tickLen * Math.sin(perpAngle));\n        ctx.lineTo(x2 + tickLen * Math.cos(perpAngle), y2 + tickLen * Math.sin(perpAngle));\n        ctx.stroke();\n\n        ctx.setLineDash([]);\n\n        // Labels near midpoint\n        const midX = (x1 + x2) / 2;\n        const midY = (y1 + y2) / 2;\n        const barDiff   = Math.abs(p2.barIndex - p1.barIndex);\n        const priceDiff = (p2.price - p1.price).toFixed(pricePrecision);\n        const barLabel   = `${barDiff} bars`;\n        const priceLabel = `${priceDiff}`;\n\n        // Offset labels perpendicular to the line\n        const labelOffsetX = -12 * Math.sin(angle);\n        const labelOffsetY =  12 * Math.cos(angle);\n\n        ctx.fillStyle = color;\n        ctx.fillText(barLabel,   midX + labelOffsetX,       midY + labelOffsetY - 12);\n        ctx.fillText(priceLabel, midX + labelOffsetX,       midY + labelOffsetY);\n\n        // Anchor dots\n        ctx.beginPath();\n        ctx.arc(x1, y1, isSelected ? 4 : 3, 0, Math.PI * 2);\n        ctx.fill();\n        ctx.beginPath();\n        ctx.arc(x2, y2, isSelected ? 4 : 3, 0, Math.PI * 2);\n        ctx.fill();\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n        return pointToSegmentDist(x, y, x1, y1, x2, y2) <= HIT_TOLERANCE;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const pts = [\n            { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n            { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n        ];\n        for (let i = 0; i < pts.length; i++) {\n            if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\n/** Extend a ray from (ox,oy) in direction (dx,dy) to x = targetX, returning the endpoint. */\nfunction extendToX(ox: number, oy: number, dx: number, dy: number, targetX: number): [number, number] {\n    if (dx === 0) return [ox, oy];\n    const t = (targetX - ox) / dx;\n    return [targetX, oy + t * dy];\n}\n\nexport class Pitchfork implements IDrawing {\n    readonly id: string;\n    readonly type = 'pitchfork' as const;\n    readonly requiredPoints = 3;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `pfk_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2, p3] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const s = resolveStyle('pitchfork', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        if (p3) {\n            const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n            const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n            // Midpoint of p2 and p3\n            const midX = (x2 + x3) / 2;\n            const midY = (y2 + y3) / 2;\n\n            // Direction vector: from p1 to midpoint\n            const dirX = midX - x1;\n            const dirY = midY - y1;\n\n            // Extend median line from p1 through midpoint to chartW\n            const [medEndX, medEndY] = extendToX(x1, y1, dirX, dirY, chartW);\n\n            // Draw handle: short line from p1 to midpoint\n            ctx.beginPath();\n            ctx.moveTo(x1, y1);\n            ctx.lineTo(midX, midY);\n            ctx.stroke();\n\n            // Median line: from p1 extended to chartW\n            ctx.beginPath();\n            ctx.moveTo(x1, y1);\n            ctx.lineTo(medEndX, medEndY);\n            ctx.stroke();\n\n            // Tine 1: from p2 extended rightward parallel to median direction\n            const [tine1EndX, tine1EndY] = extendToX(x2, y2, dirX, dirY, chartW);\n            ctx.beginPath();\n            ctx.moveTo(x2, y2);\n            ctx.lineTo(tine1EndX, tine1EndY);\n            ctx.stroke();\n\n            // Tine 2: from p3 extended rightward parallel to median direction\n            const [tine2EndX, tine2EndY] = extendToX(x3, y3, dirX, dirY, chartW);\n            ctx.beginPath();\n            ctx.moveTo(x3, y3);\n            ctx.lineTo(tine2EndX, tine2EndY);\n            ctx.stroke();\n\n            ctx.setLineDash([]);\n\n            // Anchor dots\n            if (isSelected) {\n                ctx.fillStyle = s.strokeColor;\n                for (const [ax, ay] of [[x1, y1], [x2, y2], [x3, y3]] as [number, number][]) {\n                    ctx.beginPath();\n                    ctx.arc(ax, ay, 4, 0, Math.PI * 2);\n                    ctx.fill();\n                }\n            }\n        } else {\n            // Preview: just draw first segment\n            ctx.beginPath();\n            ctx.moveTo(x1, y1);\n            ctx.lineTo(x2, y2);\n            ctx.stroke();\n            ctx.setLineDash([]);\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 3) return false;\n        const [p1, p2, p3] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n        const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n        const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n        const midX = (x2 + x3) / 2;\n        const midY = (y2 + y3) / 2;\n        const dirX = midX - x1;\n        const dirY = midY - y1;\n\n        const [medEndX, medEndY] = extendToX(x1, y1, dirX, dirY, chartW);\n        const [tine1EndX, tine1EndY] = extendToX(x2, y2, dirX, dirY, chartW);\n        const [tine2EndX, tine2EndY] = extendToX(x3, y3, dirX, dirY, chartW);\n\n        if (pointToSegmentDist(x, y, x1, y1, medEndX, medEndY) <= HIT_TOLERANCE) return true;\n        if (pointToSegmentDist(x, y, x2, y2, tine1EndX, tine1EndY) <= HIT_TOLERANCE) return true;\n        if (pointToSegmentDist(x, y, x3, y3, tine2EndX, tine2EndY) <= HIT_TOLERANCE) return true;\n\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        const candidates = this.points.map((p, i) => ({\n            i,\n            px: scale.xToPixel(p.barIndex, viewport, chartW),\n            py: scale.yToPixel(p.price, priceRange, chartH),\n        }));\n        for (const { i, px, py } of candidates) {\n            if (Math.hypot(x - px, y - py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nfunction extendToX(ox: number, oy: number, dx: number, dy: number, targetX: number): [number, number] {\n    if (dx === 0) return [ox, oy];\n    const t = (targetX - ox) / dx;\n    return [targetX, oy + t * dy];\n}\n\nexport class SchiffPitchfork implements IDrawing {\n    readonly id: string;\n    readonly type = 'schiffPitchfork' as const;\n    readonly requiredPoints = 3;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `spfk_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2, p3] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const s = resolveStyle('schiffPitchfork', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        if (p3) {\n            const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n            const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n            // Schiff: median starts at midpoint of (p1, p2) instead of p1\n            const pivotX = (x1 + x2) / 2;\n            const pivotY = (y1 + y2) / 2;\n\n            // Midpoint of p2 and p3 — median target\n            const midX = (x2 + x3) / 2;\n            const midY = (y2 + y3) / 2;\n\n            // Direction from shifted pivot to mid(p2,p3)\n            const dirX = midX - pivotX;\n            const dirY = midY - pivotY;\n\n            // Median line: from pivot extended to chartW\n            const [medEndX, medEndY] = extendToX(pivotX, pivotY, dirX, dirY, chartW);\n\n            // Draw handle: short line from pivot to midpoint\n            ctx.beginPath();\n            ctx.moveTo(pivotX, pivotY);\n            ctx.lineTo(midX, midY);\n            ctx.stroke();\n\n            // Median line\n            ctx.beginPath();\n            ctx.moveTo(pivotX, pivotY);\n            ctx.lineTo(medEndX, medEndY);\n            ctx.stroke();\n\n            // Tine 1: from p2 parallel to median direction\n            const [tine1EndX, tine1EndY] = extendToX(x2, y2, dirX, dirY, chartW);\n            ctx.beginPath();\n            ctx.moveTo(x2, y2);\n            ctx.lineTo(tine1EndX, tine1EndY);\n            ctx.stroke();\n\n            // Tine 2: from p3 parallel to median direction\n            const [tine2EndX, tine2EndY] = extendToX(x3, y3, dirX, dirY, chartW);\n            ctx.beginPath();\n            ctx.moveTo(x3, y3);\n            ctx.lineTo(tine2EndX, tine2EndY);\n            ctx.stroke();\n\n            ctx.setLineDash([]);\n\n            // Anchor dots\n            if (isSelected) {\n                ctx.fillStyle = s.strokeColor;\n                for (const [ax, ay] of [[x1, y1], [x2, y2], [x3, y3]] as [number, number][]) {\n                    ctx.beginPath();\n                    ctx.arc(ax, ay, 4, 0, Math.PI * 2);\n                    ctx.fill();\n                }\n            }\n        } else {\n            ctx.beginPath();\n            ctx.moveTo(x1, y1);\n            ctx.lineTo(x2, y2);\n            ctx.stroke();\n            ctx.setLineDash([]);\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 3) return false;\n        const [p1, p2, p3] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n        const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n        const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n        const pivotX = (x1 + x2) / 2;\n        const pivotY = (y1 + y2) / 2;\n        const midX = (x2 + x3) / 2;\n        const midY = (y2 + y3) / 2;\n        const dirX = midX - pivotX;\n        const dirY = midY - pivotY;\n\n        const [medEndX, medEndY] = extendToX(pivotX, pivotY, dirX, dirY, chartW);\n        const [tine1EndX, tine1EndY] = extendToX(x2, y2, dirX, dirY, chartW);\n        const [tine2EndX, tine2EndY] = extendToX(x3, y3, dirX, dirY, chartW);\n\n        if (pointToSegmentDist(x, y, pivotX, pivotY, medEndX, medEndY) <= HIT_TOLERANCE) return true;\n        if (pointToSegmentDist(x, y, x2, y2, tine1EndX, tine1EndY) <= HIT_TOLERANCE) return true;\n        if (pointToSegmentDist(x, y, x3, y3, tine2EndX, tine2EndY) <= HIT_TOLERANCE) return true;\n\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        const candidates = this.points.map((p, i) => ({\n            i,\n            px: scale.xToPixel(p.barIndex, viewport, chartW),\n            py: scale.yToPixel(p.price, priceRange, chartH),\n        }));\n        for (const { i, px, py } of candidates) {\n            if (Math.hypot(x - px, y - py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nfunction extendToX(ox: number, oy: number, dx: number, dy: number, targetX: number): [number, number] {\n    if (dx === 0) return [ox, oy];\n    const t = (targetX - ox) / dx;\n    return [targetX, oy + t * dy];\n}\n\nexport class ModifiedSchiff implements IDrawing {\n    readonly id: string;\n    readonly type = 'modifiedSchiff' as const;\n    readonly requiredPoints = 3;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `mspfk_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2, p3] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const s = resolveStyle('modifiedSchiff', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        if (p3) {\n            const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n            const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n            // Midpoint of p2 and p3\n            const midX = (x2 + x3) / 2;\n            const midY = (y2 + y3) / 2;\n\n            // Modified Schiff: pivot = midpoint(p1, mid(p2, p3))\n            const pivotX = (x1 + midX) / 2;\n            const pivotY = (y1 + midY) / 2;\n\n            // Direction from pivot to mid(p2,p3)\n            const dirX = midX - pivotX;\n            const dirY = midY - pivotY;\n\n            // Median line: from pivot extended to chartW\n            const [medEndX, medEndY] = extendToX(pivotX, pivotY, dirX, dirY, chartW);\n\n            // Draw handle: pivot to midpoint\n            ctx.beginPath();\n            ctx.moveTo(pivotX, pivotY);\n            ctx.lineTo(midX, midY);\n            ctx.stroke();\n\n            // Median line\n            ctx.beginPath();\n            ctx.moveTo(pivotX, pivotY);\n            ctx.lineTo(medEndX, medEndY);\n            ctx.stroke();\n\n            // Tine 1: from p2 parallel to median direction\n            const [tine1EndX, tine1EndY] = extendToX(x2, y2, dirX, dirY, chartW);\n            ctx.beginPath();\n            ctx.moveTo(x2, y2);\n            ctx.lineTo(tine1EndX, tine1EndY);\n            ctx.stroke();\n\n            // Tine 2: from p3 parallel to median direction\n            const [tine2EndX, tine2EndY] = extendToX(x3, y3, dirX, dirY, chartW);\n            ctx.beginPath();\n            ctx.moveTo(x3, y3);\n            ctx.lineTo(tine2EndX, tine2EndY);\n            ctx.stroke();\n\n            ctx.setLineDash([]);\n\n            // Anchor dots\n            if (isSelected) {\n                ctx.fillStyle = s.strokeColor;\n                for (const [ax, ay] of [[x1, y1], [x2, y2], [x3, y3]] as [number, number][]) {\n                    ctx.beginPath();\n                    ctx.arc(ax, ay, 4, 0, Math.PI * 2);\n                    ctx.fill();\n                }\n            }\n        } else {\n            ctx.beginPath();\n            ctx.moveTo(x1, y1);\n            ctx.lineTo(x2, y2);\n            ctx.stroke();\n            ctx.setLineDash([]);\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 3) return false;\n        const [p1, p2, p3] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n        const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n        const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n        const midX = (x2 + x3) / 2;\n        const midY = (y2 + y3) / 2;\n        const pivotX = (x1 + midX) / 2;\n        const pivotY = (y1 + midY) / 2;\n        const dirX = midX - pivotX;\n        const dirY = midY - pivotY;\n\n        const [medEndX, medEndY] = extendToX(pivotX, pivotY, dirX, dirY, chartW);\n        const [tine1EndX, tine1EndY] = extendToX(x2, y2, dirX, dirY, chartW);\n        const [tine2EndX, tine2EndY] = extendToX(x3, y3, dirX, dirY, chartW);\n\n        if (pointToSegmentDist(x, y, pivotX, pivotY, medEndX, medEndY) <= HIT_TOLERANCE) return true;\n        if (pointToSegmentDist(x, y, x2, y2, tine1EndX, tine1EndY) <= HIT_TOLERANCE) return true;\n        if (pointToSegmentDist(x, y, x3, y3, tine2EndX, tine2EndY) <= HIT_TOLERANCE) return true;\n\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        const candidates = this.points.map((p, i) => ({\n            i,\n            px: scale.xToPixel(p.barIndex, viewport, chartW),\n            py: scale.yToPixel(p.price, priceRange, chartH),\n        }));\n        for (const { i, px, py } of candidates) {\n            if (Math.hypot(x - px, y - py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nfunction extendToX(ox: number, oy: number, dx: number, dy: number, targetX: number): [number, number] {\n    if (dx === 0) return [ox, oy];\n    const t = (targetX - ox) / dx;\n    return [targetX, oy + t * dy];\n}\n\nexport class InsidePitchfork implements IDrawing {\n    readonly id: string;\n    readonly type = 'insidePitchfork' as const;\n    readonly requiredPoints = 3;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `ipfk_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2, p3] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const s = resolveStyle('insidePitchfork', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        if (p3) {\n            const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n            const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n            // Midpoint of p2 and p3\n            const midX = (x2 + x3) / 2;\n            const midY = (y2 + y3) / 2;\n\n            // Direction vector: from p1 to midpoint\n            const dirX = midX - x1;\n            const dirY = midY - y1;\n\n            // 1. Handle: p1 to mid(p2,p3)\n            ctx.beginPath();\n            ctx.moveTo(x1, y1);\n            ctx.lineTo(midX, midY);\n            ctx.stroke();\n\n            // 2. Median line: from p1 extended to chartW\n            const [medEndX, medEndY] = extendToX(x1, y1, dirX, dirY, chartW);\n            ctx.beginPath();\n            ctx.moveTo(x1, y1);\n            ctx.lineTo(medEndX, medEndY);\n            ctx.stroke();\n\n            // 3. Outer tine 1: from p2\n            const [tine1EndX, tine1EndY] = extendToX(x2, y2, dirX, dirY, chartW);\n            ctx.beginPath();\n            ctx.moveTo(x2, y2);\n            ctx.lineTo(tine1EndX, tine1EndY);\n            ctx.stroke();\n\n            // 4. Outer tine 2: from p3\n            const [tine2EndX, tine2EndY] = extendToX(x3, y3, dirX, dirY, chartW);\n            ctx.beginPath();\n            ctx.moveTo(x3, y3);\n            ctx.lineTo(tine2EndX, tine2EndY);\n            ctx.stroke();\n\n            // 5. Inner half-tines at 50% between median and each outer tine\n            // Inner tine 1: halfway between p1 and p2 (x,y) as origin, parallel to median\n            const inner1X = (x1 + x2) / 2;\n            const inner1Y = (y1 + y2) / 2;\n            const [inner1EndX, inner1EndY] = extendToX(inner1X, inner1Y, dirX, dirY, chartW);\n            ctx.globalAlpha = 0.55;\n            ctx.setLineDash([4, 3]);\n            ctx.beginPath();\n            ctx.moveTo(inner1X, inner1Y);\n            ctx.lineTo(inner1EndX, inner1EndY);\n            ctx.stroke();\n\n            // Inner tine 2: halfway between p1 and p3\n            const inner2X = (x1 + x3) / 2;\n            const inner2Y = (y1 + y3) / 2;\n            const [inner2EndX, inner2EndY] = extendToX(inner2X, inner2Y, dirX, dirY, chartW);\n            ctx.beginPath();\n            ctx.moveTo(inner2X, inner2Y);\n            ctx.lineTo(inner2EndX, inner2EndY);\n            ctx.stroke();\n\n            ctx.setLineDash([]);\n            ctx.globalAlpha = 1;\n\n            // Anchor dots\n            if (isSelected) {\n                ctx.fillStyle = s.strokeColor;\n                for (const [ax, ay] of [[x1, y1], [x2, y2], [x3, y3]] as [number, number][]) {\n                    ctx.beginPath();\n                    ctx.arc(ax, ay, 4, 0, Math.PI * 2);\n                    ctx.fill();\n                }\n            }\n        } else {\n            ctx.beginPath();\n            ctx.moveTo(x1, y1);\n            ctx.lineTo(x2, y2);\n            ctx.stroke();\n            ctx.setLineDash([]);\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 3) return false;\n        const [p1, p2, p3] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n        const x3 = scale.xToPixel(p3.barIndex, viewport, chartW);\n        const y3 = scale.yToPixel(p3.price, priceRange, chartH);\n\n        const midX = (x2 + x3) / 2;\n        const midY = (y2 + y3) / 2;\n        const dirX = midX - x1;\n        const dirY = midY - y1;\n\n        const [medEndX, medEndY] = extendToX(x1, y1, dirX, dirY, chartW);\n        const [tine1EndX, tine1EndY] = extendToX(x2, y2, dirX, dirY, chartW);\n        const [tine2EndX, tine2EndY] = extendToX(x3, y3, dirX, dirY, chartW);\n\n        if (pointToSegmentDist(x, y, x1, y1, medEndX, medEndY) <= HIT_TOLERANCE) return true;\n        if (pointToSegmentDist(x, y, x2, y2, tine1EndX, tine1EndY) <= HIT_TOLERANCE) return true;\n        if (pointToSegmentDist(x, y, x3, y3, tine2EndX, tine2EndY) <= HIT_TOLERANCE) return true;\n\n        // Inner half-tines\n        const inner1X = (x1 + x2) / 2;\n        const inner1Y = (y1 + y2) / 2;\n        const [inner1EndX, inner1EndY] = extendToX(inner1X, inner1Y, dirX, dirY, chartW);\n        if (pointToSegmentDist(x, y, inner1X, inner1Y, inner1EndX, inner1EndY) <= HIT_TOLERANCE) return true;\n\n        const inner2X = (x1 + x3) / 2;\n        const inner2Y = (y1 + y3) / 2;\n        const [inner2EndX, inner2EndY] = extendToX(inner2X, inner2Y, dirX, dirY, chartW);\n        if (pointToSegmentDist(x, y, inner2X, inner2Y, inner2EndX, inner2EndY) <= HIT_TOLERANCE) return true;\n\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        const candidates = this.points.map((p, i) => ({\n            i,\n            px: scale.xToPixel(p.barIndex, viewport, chartW),\n            py: scale.yToPixel(p.price, priceRange, chartH),\n        }));\n        for (const { i, px, py } of candidates) {\n            if (Math.hypot(x - px, y - py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\n// Bell-curve-like bar widths for 8 bars (values are relative fractions 0–1)\nconst BAR_WEIGHTS = [0.35, 0.55, 0.75, 1.0, 1.0, 0.75, 0.55, 0.35];\n\nexport class FixedRangeVP implements IDrawing {\n    readonly id: string;\n    readonly type = 'fixedRangeVP' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `frvp_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const rx = Math.min(x1, x2);\n        const ry = Math.min(y1, y2);\n        const rw = Math.abs(x2 - x1);\n        const rh = Math.abs(y2 - y1);\n\n        const s = resolveStyle('fixedRangeVP', this.style, theme);\n\n        ctx.save();\n\n        // Rectangle border\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n        ctx.strokeRect(rx, ry, rw, rh);\n        ctx.setLineDash([]);\n\n        // Simulated volume histogram: 8 horizontal bars on the left side\n        const numBars = BAR_WEIGHTS.length;\n        const barH = rh / numBars;\n        const maxBarW = rw * 0.6; // bars occupy up to 60% of rect width\n        const barFill = hexWithAlpha(s.fillColor, s.fillOpacity);\n\n        for (let i = 0; i < numBars; i++) {\n            const barW = maxBarW * BAR_WEIGHTS[i];\n            const barY = ry + i * barH;\n            ctx.fillStyle = barFill;\n            ctx.fillRect(rx, barY, barW, barH - 1);\n        }\n\n        // Label at top-left\n        ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n        ctx.fillStyle = s.strokeColor;\n        ctx.fillText('Volume Profile', rx + 4, ry + 13);\n\n        // Corner handles when selected\n        if (isSelected) {\n            for (const [cx, cy] of [[x1, y1], [x2, y2]] as [number, number][]) {\n                ctx.beginPath();\n                ctx.arc(cx, cy, 3.5, 0, Math.PI * 2);\n                ctx.fillStyle = s.strokeColor;\n                ctx.fill();\n            }\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const rx = Math.min(x1, x2) - HIT_TOLERANCE;\n        const ry = Math.min(y1, y2) - HIT_TOLERANCE;\n        const rw = Math.abs(x2 - x1) + HIT_TOLERANCE * 2;\n        const rh = Math.abs(y2 - y1) + HIT_TOLERANCE * 2;\n\n        return x >= rx && x <= rx + rw && y >= ry && y <= ry + rh;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const handles: [number, number, number][] = [\n            [0, scale.xToPixel(this.points[0].barIndex, viewport, chartW), scale.yToPixel(this.points[0].price, priceRange, chartH)],\n            [1, scale.xToPixel(this.points[1].barIndex, viewport, chartW), scale.yToPixel(this.points[1].price, priceRange, chartH)],\n        ];\n        for (const [pi, hx, hy] of handles) {\n            if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: pi, cursor: 'nwse-resize' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\n// Bell-curve-like bar widths for 8 bars (values are relative fractions 0–1)\nconst BAR_WEIGHTS = [0.35, 0.55, 0.75, 1.0, 1.0, 0.75, 0.55, 0.35];\n\nexport class AnchoredVP implements IDrawing {\n    readonly id: string;\n    readonly type = 'anchoredVP' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `avp_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const rx = Math.min(x1, x2);\n        const ry = Math.min(y1, y2);\n        const rw = Math.abs(x2 - x1);\n        const rh = Math.abs(y2 - y1);\n\n        const s = resolveStyle('anchoredVP', this.style, theme);\n\n        ctx.save();\n\n        // Rectangle border\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n        ctx.strokeRect(rx, ry, rw, rh);\n        ctx.setLineDash([]);\n\n        // Simulated volume histogram: 8 horizontal bars on the left side\n        const numBars = BAR_WEIGHTS.length;\n        const barH = rh / numBars;\n        const maxBarW = rw * 0.6;\n        const barFill = hexWithAlpha(s.fillColor, s.fillOpacity);\n\n        for (let i = 0; i < numBars; i++) {\n            const barW = maxBarW * BAR_WEIGHTS[i];\n            const barY = ry + i * barH;\n            ctx.fillStyle = barFill;\n            ctx.fillRect(rx, barY, barW, barH - 1);\n        }\n\n        // Label at top-left\n        ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n        ctx.fillStyle = s.strokeColor;\n        ctx.fillText('Anchored VP', rx + 4, ry + 13);\n\n        // Anchor point indicator: small diamond at p1\n        ctx.beginPath();\n        ctx.arc(x1, y1, isSelected ? 4 : 3, 0, Math.PI * 2);\n        ctx.fillStyle = s.strokeColor;\n        ctx.fill();\n\n        // Corner handles when selected\n        if (isSelected) {\n            for (const [cx, cy] of [[x1, y1], [x2, y2]] as [number, number][]) {\n                ctx.beginPath();\n                ctx.arc(cx, cy, 3.5, 0, Math.PI * 2);\n                ctx.fillStyle = s.strokeColor;\n                ctx.fill();\n            }\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const rx = Math.min(x1, x2) - HIT_TOLERANCE;\n        const ry = Math.min(y1, y2) - HIT_TOLERANCE;\n        const rw = Math.abs(x2 - x1) + HIT_TOLERANCE * 2;\n        const rh = Math.abs(y2 - y1) + HIT_TOLERANCE * 2;\n\n        return x >= rx && x <= rx + rw && y >= ry && y <= ry + rh;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const handles: [number, number, number][] = [\n            [0, scale.xToPixel(this.points[0].barIndex, viewport, chartW), scale.yToPixel(this.points[0].price, priceRange, chartH)],\n            [1, scale.xToPixel(this.points[1].barIndex, viewport, chartW), scale.yToPixel(this.points[1].price, priceRange, chartH)],\n        ];\n        for (const [pi, hx, hy] of handles) {\n            if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: pi, cursor: 'nwse-resize' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\n// Bell-curve-like bar widths for 10 bars (values are relative fractions 0–1)\nconst BAR_WEIGHTS = [0.25, 0.45, 0.65, 0.85, 1.0, 1.0, 0.85, 0.65, 0.45, 0.25];\n\nexport class VolumeProfile implements IDrawing {\n    readonly id: string;\n    readonly type = 'volumeProfile' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `vp_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const rx = Math.min(x1, x2);\n        const ry = Math.min(y1, y2);\n        const rw = Math.abs(x2 - x1);\n        const rh = Math.abs(y2 - y1);\n\n        const s = resolveStyle('volumeProfile', this.style, theme);\n\n        ctx.save();\n\n        // Rectangle border\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n        ctx.strokeRect(rx, ry, rw, rh);\n        ctx.setLineDash([]);\n\n        // Simulated volume histogram: 10 horizontal bars on the left side\n        const numBars = BAR_WEIGHTS.length;\n        const barH = rh / numBars;\n        const maxBarW = rw * 0.6;\n        const barFill = hexWithAlpha(s.fillColor, s.fillOpacity);\n\n        for (let i = 0; i < numBars; i++) {\n            const barW = maxBarW * BAR_WEIGHTS[i];\n            const barY = ry + i * barH;\n            ctx.fillStyle = barFill;\n            ctx.fillRect(rx, barY, barW, barH - 1);\n        }\n\n        // Label at top-left\n        ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n        ctx.fillStyle = s.strokeColor;\n        ctx.fillText('Volume Profile', rx + 4, ry + 13);\n\n        // Corner handles when selected\n        if (isSelected) {\n            for (const [cx, cy] of [[x1, y1], [x2, y2]] as [number, number][]) {\n                ctx.beginPath();\n                ctx.arc(cx, cy, 3.5, 0, Math.PI * 2);\n                ctx.fillStyle = s.strokeColor;\n                ctx.fill();\n            }\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const rx = Math.min(x1, x2) - HIT_TOLERANCE;\n        const ry = Math.min(y1, y2) - HIT_TOLERANCE;\n        const rw = Math.abs(x2 - x1) + HIT_TOLERANCE * 2;\n        const rh = Math.abs(y2 - y1) + HIT_TOLERANCE * 2;\n\n        return x >= rx && x <= rx + rw && y >= ry && y <= ry + rh;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const handles: [number, number, number][] = [\n            [0, scale.xToPixel(this.points[0].barIndex, viewport, chartW), scale.yToPixel(this.points[0].price, priceRange, chartH)],\n            [1, scale.xToPixel(this.points[1].barIndex, viewport, chartW), scale.yToPixel(this.points[1].price, priceRange, chartH)],\n        ];\n        for (const [pi, hx, hy] of handles) {\n            if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: pi, cursor: 'nwse-resize' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class RegressionTrend implements IDrawing {\n    readonly id: string;\n    readonly type = 'regressionTrend' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `reg_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const s = resolveStyle('regressionTrend', this.style, theme);\n        const channelColor = hexWithAlpha(s.strokeColor, 0.4);\n\n        // Perpendicular unit vector for the ±20px offset channels\n        const lineLen = Math.hypot(x2 - x1, y2 - y1) || 1;\n        const perpX   = -(y2 - y1) / lineLen;\n        const perpY   =  (x2 - x1) / lineLen;\n        const offset  = 20;\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.fillStyle   = s.strokeColor;\n        ctx.lineWidth   = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n\n        // Main diagonal line (solid)\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n        ctx.beginPath();\n        ctx.moveTo(x1, y1);\n        ctx.lineTo(x2, y2);\n        ctx.stroke();\n\n        // Upper channel at +20px perpendicular offset (dashed)\n        ctx.strokeStyle = channelColor;\n        ctx.setLineDash([4, 3]);\n        ctx.beginPath();\n        ctx.moveTo(x1 + perpX * offset, y1 + perpY * offset);\n        ctx.lineTo(x2 + perpX * offset, y2 + perpY * offset);\n        ctx.stroke();\n\n        // Lower channel at -20px perpendicular offset (dashed)\n        ctx.beginPath();\n        ctx.moveTo(x1 - perpX * offset, y1 - perpY * offset);\n        ctx.lineTo(x2 - perpX * offset, y2 - perpY * offset);\n        ctx.stroke();\n\n        ctx.setLineDash([]);\n\n        // Anchor dots at p1 and p2\n        ctx.beginPath();\n        ctx.arc(x1, y1, isSelected ? 4 : 3, 0, Math.PI * 2);\n        ctx.fill();\n        ctx.beginPath();\n        ctx.arc(x2, y2, isSelected ? 4 : 3, 0, Math.PI * 2);\n        ctx.fill();\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n        return pointToSegmentDist(x, y, x1, y1, x2, y2) <= HIT_TOLERANCE;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const pts = [\n            { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n            { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n        ];\n        for (let i = 0; i < pts.length; i++) {\n            if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle } from './styleUtils.js';\nconst HIT_TOLERANCE = 6;\nconst PLACEHOLDER = 'Text';\nconst PAD = 4;\n\nexport class Text implements IDrawing {\n    readonly id: string;\n    readonly type = 'text' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    text: string = '';\n    style?: AnyDrawingStyle;\n\n    constructor(point: DrawingPoint) {\n        this.id = `txt_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [point];\n        this.complete = true;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        const x = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n        const y = scale.yToPixel(this.points[0].price, priceRange, chartH);\n\n        const s = resolveStyle('text', this.style, theme);\n        const fontSize = s.fontSize ?? 13;\n        const textColor = s.textColor ?? '#f5f5f5';\n\n        ctx.save();\n        ctx.font = `${fontSize}px system-ui, sans-serif`;\n        ctx.textBaseline = 'top';\n\n        const label = this.text || PLACEHOLDER;\n        const isPlaceholder = !this.text;\n        const textW = ctx.measureText(label).width;\n\n        if (isSelected) {\n            ctx.strokeStyle = '#2196f3';\n            ctx.lineWidth = 1;\n            ctx.strokeRect(x - 2, y - 2, textW + PAD * 2, 16 + 4);\n        }\n\n        ctx.fillStyle = isPlaceholder ? '#888' : textColor;\n        ctx.fillText(label, x + PAD, y);\n\n        if (isSelected) {\n            ctx.strokeStyle = textColor;\n            ctx.lineWidth = 1;\n            ctx.beginPath();\n            ctx.moveTo(x, y + 16);\n            ctx.lineTo(x + textW + PAD * 2, y + 16);\n            ctx.stroke();\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        const ax = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n        const ay = scale.yToPixel(this.points[0].price, priceRange, chartH);\n        // Use a conservative fixed width for hit-testing (avoids needing ctx here)\n        const approxW = Math.max(40, (this.text?.length ?? 4) * 8);\n        return (\n            x >= ax - HIT_TOLERANCE &&\n            x <= ax + approxW + HIT_TOLERANCE &&\n            y >= ay - HIT_TOLERANCE &&\n            y <= ay + 16 + HIT_TOLERANCE\n        );\n    }\n\n    getHandle(): DrawingHandle | null {\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\nconst HIT_TOLERANCE = 6;\n\nconst BOX_H = 24;\nconst RADIUS = 8;\nconst PAD_H = 12; // horizontal padding inside box\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nfunction roundedRect(ctx: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, r: number): void {\n    ctx.beginPath();\n    ctx.moveTo(x + r, y);\n    ctx.lineTo(x + w - r, y);\n    ctx.arcTo(x + w, y, x + w, y + r, r);\n    ctx.lineTo(x + w, y + h - r);\n    ctx.arcTo(x + w, y + h, x + w - r, y + h, r);\n    ctx.lineTo(x + r, y + h);\n    ctx.arcTo(x, y + h, x, y + h - r, r);\n    ctx.lineTo(x, y + r);\n    ctx.arcTo(x, y, x + r, y, r);\n    ctx.closePath();\n}\n\nexport class Callout implements IDrawing {\n    readonly id: string;\n    readonly type = 'callout' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    text: string = '';\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `cal_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    private getBoxW(ctx: CanvasRenderingContext2D): number {\n        const label = this.text || 'Note';\n        return Math.max(60, ctx.measureText(label).width + PAD_H * 2);\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const tipX = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const tipY = scale.yToPixel(p1.price, priceRange, chartH);\n        const boxX = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const boxY = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const s = resolveStyle('callout', this.style, theme);\n        const fontSize = s.fontSize ?? 11;\n        const textColor = s.textColor ?? '#f5f5f5';\n\n        ctx.save();\n        ctx.font = `${fontSize}px system-ui, sans-serif`;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        const boxW = this.getBoxW(ctx);\n        const bx = boxX - boxW / 2;\n        const by = boxY - BOX_H / 2;\n\n        // Find nearest edge point of the box to draw the pointer line\n        const clampedX = Math.max(bx, Math.min(bx + boxW, tipX));\n        const clampedY = Math.max(by, Math.min(by + BOX_H, tipY));\n        const edgeX = tipX < bx ? bx : tipX > bx + boxW ? bx + boxW : clampedX;\n        const edgeY = tipY < by ? by : tipY > by + BOX_H ? by + BOX_H : clampedY;\n\n        // Pointer line\n        ctx.strokeStyle = s.strokeColor;\n        ctx.beginPath();\n        ctx.moveTo(edgeX, edgeY);\n        ctx.lineTo(tipX, tipY);\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        // Small dot at tip\n        ctx.fillStyle = s.strokeColor;\n        ctx.beginPath();\n        ctx.arc(tipX, tipY, 3, 0, Math.PI * 2);\n        ctx.fill();\n\n        // Rounded box background\n        roundedRect(ctx, bx, by, boxW, BOX_H, RADIUS);\n        ctx.fillStyle = hexWithAlpha(s.fillColor, s.fillOpacity);\n        ctx.fill();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.stroke();\n\n        // Text\n        const label = this.text || 'Note';\n        const isPlaceholder = !this.text;\n        ctx.fillStyle = isPlaceholder ? '#888' : textColor;\n        ctx.textBaseline = 'middle';\n        ctx.textAlign = 'center';\n        ctx.fillText(label, boxX, boxY);\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2] = this.points;\n        const tipX = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const tipY = scale.yToPixel(p1.price, priceRange, chartH);\n        const boxX = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const boxY = scale.yToPixel(p2.price, priceRange, chartH);\n        const approxBoxW = Math.max(60, (this.text?.length ?? 4) * 7 + 24);\n        const bx = boxX - approxBoxW / 2;\n        const by = boxY - BOX_H / 2;\n\n        // Hit on box\n        if (x >= bx - HIT_TOLERANCE && x <= bx + approxBoxW + HIT_TOLERANCE &&\n            y >= by - HIT_TOLERANCE && y <= by + BOX_H + HIT_TOLERANCE) {\n            return true;\n        }\n\n        // Find nearest edge point (same logic as render)\n        const edgeX = tipX < bx ? bx : tipX > bx + approxBoxW ? bx + approxBoxW : Math.max(bx, Math.min(bx + approxBoxW, tipX));\n        const edgeY = tipY < by ? by : tipY > by + BOX_H ? by + BOX_H : Math.max(by, Math.min(by + BOX_H, tipY));\n\n        // Hit on pointer line\n        if (pointToSegmentDist(x, y, edgeX, edgeY, tipX, tipY) <= HIT_TOLERANCE) {\n            return true;\n        }\n\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const pts = [\n            { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n            { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n        ];\n        const cursors: string[] = ['grab', 'move'];\n        for (let i = 0; i < pts.length; i++) {\n            if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 4) {\n                return { pointIndex: i, cursor: cursors[i] };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle } from './styleUtils.js';\nconst HIT_TOLERANCE = 6;\n\nconst BADGE_W = 60;\nconst BADGE_H = 18;\nconst ARROW_W = 7; // width of the left triangle pointer\n\nexport class PriceLabel implements IDrawing {\n    readonly id: string;\n    readonly type = 'priceLabel' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(point: DrawingPoint) {\n        this.id = `plbl_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [point];\n        this.complete = true;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        pricePrecision = 2,\n        theme?: ChartTheme,\n    ): void {\n        const x = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n        const y = scale.yToPixel(this.points[0].price, priceRange, chartH);\n        const price = this.points[0].price;\n\n        const s = resolveStyle('priceLabel', this.style, theme);\n        const fontSize = s.fontSize ?? 11;\n        const textColor = s.textColor ?? '#ffffff';\n\n        ctx.save();\n\n        // Triangle pointer pointing left\n        ctx.fillStyle = s.fillColor;\n        ctx.beginPath();\n        ctx.moveTo(x, y);                           // tip of arrow (left-most)\n        ctx.lineTo(x + ARROW_W, y - BADGE_H / 2);\n        ctx.lineTo(x + ARROW_W, y + BADGE_H / 2);\n        ctx.closePath();\n        ctx.fill();\n\n        // Pill badge to the right of the arrow\n        const bx = x + ARROW_W;\n        const by = y - BADGE_H / 2;\n        ctx.fillStyle = s.fillColor;\n        ctx.beginPath();\n        ctx.roundRect(bx, by, BADGE_W, BADGE_H, BADGE_H / 2);\n        ctx.fill();\n\n        // Selection outline\n        if (isSelected) {\n            ctx.strokeStyle = s.strokeColor;\n            ctx.lineWidth = s.lineWidth + 0.5;\n            ctx.beginPath();\n            ctx.roundRect(bx - 2, by - 2, BADGE_W + 4, BADGE_H + 4, BADGE_H / 2 + 2);\n            ctx.stroke();\n        }\n\n        // Price text\n        ctx.font = `${fontSize}px 'Inter', system-ui, sans-serif`;\n        ctx.fillStyle = textColor;\n        ctx.textBaseline = 'middle';\n        ctx.textAlign = 'center';\n        ctx.fillText(price.toFixed(pricePrecision), bx + BADGE_W / 2, y);\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        const ax = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n        const ay = scale.yToPixel(this.points[0].price, priceRange, chartH);\n        const bx = ax + ARROW_W;\n        const by = ay - BADGE_H / 2;\n        return (\n            x >= ax - HIT_TOLERANCE &&\n            x <= bx + BADGE_W + HIT_TOLERANCE &&\n            y >= by - HIT_TOLERANCE &&\n            y <= by + BADGE_H + HIT_TOLERANCE\n        );\n    }\n\n    getHandle(): DrawingHandle | null {\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class ArrowMarker implements IDrawing {\n    readonly id: string;\n    readonly type = 'arrowMarker' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `arw_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const s = resolveStyle('arrowMarker', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.fillStyle = hexWithAlpha(s.fillColor, s.fillOpacity);\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        // Line from tail to tip\n        ctx.beginPath();\n        ctx.moveTo(x1, y1);\n        ctx.lineTo(x2, y2);\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        // Arrowhead at p2 (tip)\n        const angle = Math.atan2(y2 - y1, x2 - x1);\n        const size = 10;\n        ctx.beginPath();\n        ctx.moveTo(x2, y2);\n        ctx.lineTo(x2 - size * Math.cos(angle - Math.PI / 6), y2 - size * Math.sin(angle - Math.PI / 6));\n        ctx.lineTo(x2 - size * Math.cos(angle + Math.PI / 6), y2 - size * Math.sin(angle + Math.PI / 6));\n        ctx.closePath();\n        ctx.fill();\n\n        // Anchor dots when selected\n        if (isSelected) {\n            ctx.fillStyle = s.strokeColor;\n            for (const [cx, cy] of [[x1, y1], [x2, y2]] as [number, number][]) {\n                ctx.beginPath();\n                ctx.arc(cx, cy, 4, 0, Math.PI * 2);\n                ctx.fill();\n            }\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n        return pointToSegmentDist(x, y, x1, y1, x2, y2) <= HIT_TOLERANCE;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const pts = [\n            { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n            { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n        ];\n        for (let i = 0; i < pts.length; i++) {\n            if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\nconst HIT_TOLERANCE = 6;\n\nexport class Flag implements IDrawing {\n    readonly id: string;\n    readonly type = 'flag' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(point: DrawingPoint) {\n        this.id = `flag_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [point];\n        this.complete = true;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        const x = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n        const y = scale.yToPixel(this.points[0].price, priceRange, chartH);\n\n        const s = resolveStyle('flag', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        // Vertical flagpole: from (x, y+20) up to (x, y-10)\n        ctx.beginPath();\n        ctx.moveTo(x, y + 20);\n        ctx.lineTo(x, y - 10);\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        // Flag rectangle: 16px wide × 10px tall at top of pole\n        const flagX = x;\n        const flagY = y - 10;\n        ctx.fillStyle = hexWithAlpha(s.fillColor, s.fillOpacity);\n        ctx.fillRect(flagX, flagY, 16, 10);\n\n        // Text \"F\" in white inside the flag\n        ctx.font = '8px system-ui, sans-serif';\n        ctx.fillStyle = '#ffffff';\n        ctx.textBaseline = 'middle';\n        ctx.textAlign = 'center';\n        ctx.fillText('F', flagX + 8, flagY + 5);\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        const ax = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n        const ay = scale.yToPixel(this.points[0].price, priceRange, chartH);\n        return Math.hypot(x - ax, y - ay) <= 20;\n    }\n\n    getHandle(): DrawingHandle | null {\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\nconst HIT_TOLERANCE = 6;\n\nconst BADGE_H = 16;\nconst BADGE_PADDING_X = 6;\nconst TICK_HALF = 10; // half-width of the tick mark\n\nexport class PriceNote implements IDrawing {\n    readonly id: string;\n    readonly type = 'priceNote' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(point: DrawingPoint) {\n        this.id = `pnote_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [point];\n        this.complete = true;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        pricePrecision = 2,\n        theme?: ChartTheme,\n    ): void {\n        const x = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n        const y = scale.yToPixel(this.points[0].price, priceRange, chartH);\n        const price = this.points[0].price;\n        const label = price.toFixed(pricePrecision);\n\n        const s = resolveStyle('priceNote', this.style, theme);\n        const fontSize = s.fontSize ?? 11;\n        const textColor = s.textColor ?? '#ffffff';\n\n        ctx.save();\n\n        // Horizontal tick mark: x-10 to x+10\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n        ctx.beginPath();\n        ctx.moveTo(x - TICK_HALF, y);\n        ctx.lineTo(x + TICK_HALF, y);\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        // Measure text for badge width\n        ctx.font = `${fontSize}px 'Inter', system-ui, sans-serif`;\n        const tw = ctx.measureText(label).width;\n        const badgeW = tw + BADGE_PADDING_X * 2;\n\n        // Badge rectangle to the right of the tick\n        const bx = x + TICK_HALF + 2;\n        const by = y - BADGE_H / 2;\n        ctx.fillStyle = s.fillColor;\n        ctx.beginPath();\n        ctx.roundRect(bx, by, badgeW, BADGE_H, 3);\n        ctx.fill();\n\n        // Price text in badge\n        ctx.fillStyle = textColor;\n        ctx.textBaseline = 'middle';\n        ctx.textAlign = 'center';\n        ctx.fillText(label, bx + badgeW / 2, y);\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        const ax = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n        const ay = scale.yToPixel(this.points[0].price, priceRange, chartH);\n        // Check near the tick mark\n        return (\n            x >= ax - TICK_HALF - HIT_TOLERANCE &&\n            x <= ax + TICK_HALF + HIT_TOLERANCE &&\n            Math.abs(y - ay) <= HIT_TOLERANCE\n        );\n    }\n\n    getHandle(): DrawingHandle | null {\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, hexWithAlpha } from './styleUtils.js';\nconst HIT_TOLERANCE = 6;\n\nconst BADGE_H = 20;\nconst PAD_H = 10; // horizontal padding inside badge\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class AnchoredNote implements IDrawing {\n    readonly id: string;\n    readonly type = 'anchoredNote' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    text: string = '';\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `anote_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    private getBadgeW(ctx: CanvasRenderingContext2D): number {\n        const label = this.text || 'Note';\n        return Math.max(50, ctx.measureText(label).width + PAD_H * 2);\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const s = resolveStyle('anchoredNote', this.style, theme);\n        const fontSize = s.fontSize ?? 11;\n        const textColor = s.textColor ?? '#f5f5f5';\n\n        ctx.save();\n        ctx.font = `${fontSize}px system-ui, sans-serif`;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n\n        const badgeW = this.getBadgeW(ctx);\n        const bx = x2 - badgeW / 2;\n        const by = y2 - BADGE_H / 2;\n\n        // Dashed line from anchor (p1) to note position (p2)\n        ctx.strokeStyle = s.strokeColor;\n        ctx.setLineDash([4, 3]);\n        ctx.beginPath();\n        ctx.moveTo(x1, y1);\n        ctx.lineTo(x2, y2);\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        // Small dot at anchor\n        ctx.fillStyle = s.strokeColor;\n        ctx.beginPath();\n        ctx.arc(x1, y1, 3, 0, Math.PI * 2);\n        ctx.fill();\n\n        // Badge background\n        ctx.fillStyle = hexWithAlpha(s.fillColor, s.fillOpacity);\n        ctx.beginPath();\n        ctx.roundRect(bx, by, badgeW, BADGE_H, 4);\n        ctx.fill();\n\n        // Badge border\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        ctx.beginPath();\n        ctx.roundRect(bx, by, badgeW, BADGE_H, 4);\n        ctx.stroke();\n\n        // Badge text\n        const label = this.text || 'Note';\n        const isPlaceholder = !this.text;\n        ctx.fillStyle = isPlaceholder ? '#888' : textColor;\n        ctx.textBaseline = 'middle';\n        ctx.textAlign = 'center';\n        ctx.fillText(label, x2, y2);\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n        const approxBadgeW = Math.max(50, (this.text?.length ?? 4) * 7 + 20);\n        const bx = x2 - approxBadgeW / 2;\n        const by = y2 - BADGE_H / 2;\n\n        // Near the badge\n        if (x >= bx - HIT_TOLERANCE && x <= bx + approxBadgeW + HIT_TOLERANCE &&\n            y >= by - HIT_TOLERANCE && y <= by + BADGE_H + HIT_TOLERANCE) {\n            return true;\n        }\n\n        // Near the dashed line\n        if (pointToSegmentDist(x, y, x1, y1, x2, y2) <= HIT_TOLERANCE) {\n            return true;\n        }\n\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const pts = [\n            { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n            { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n        ];\n        const cursors: string[] = ['grab', 'move'];\n        for (let i = 0; i < pts.length; i++) {\n            if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 4) {\n                return { pointIndex: i, cursor: cursors[i] };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\nconst HIT_TOLERANCE = 6;\n\nexport class ArrowUp implements IDrawing {\n    readonly id: string;\n    readonly type = 'arrowUp' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(point: DrawingPoint) {\n        this.id = `awup_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [point];\n        this.complete = true;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        const x = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n        const y = scale.yToPixel(this.points[0].price, priceRange, chartH);\n\n        const s = resolveStyle('arrowUp', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.fillStyle = hexWithAlpha(s.fillColor, s.fillOpacity);\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        // Vertical line from (x, y+10) to (x, y-2)\n        ctx.beginPath();\n        ctx.moveTo(x, y + 10);\n        ctx.lineTo(x, y - 2);\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        // Arrowhead pointing up: triangle at top (x, y-10)\n        const tipX = x;\n        const tipY = y - 10;\n        const halfBase = 6;\n        ctx.beginPath();\n        ctx.moveTo(tipX, tipY);\n        ctx.lineTo(tipX - halfBase, tipY + 10);\n        ctx.lineTo(tipX + halfBase, tipY + 10);\n        ctx.closePath();\n        ctx.fill();\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        const ax = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n        const ay = scale.yToPixel(this.points[0].price, priceRange, chartH);\n        return Math.hypot(x - ax, y - ay) <= 12;\n    }\n\n    getHandle(): DrawingHandle | null {\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\nconst HIT_TOLERANCE = 6;\n\nexport class ArrowDown implements IDrawing {\n    readonly id: string;\n    readonly type = 'arrowDown' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(point: DrawingPoint) {\n        this.id = `awdn_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [point];\n        this.complete = true;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        const x = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n        const y = scale.yToPixel(this.points[0].price, priceRange, chartH);\n\n        const s = resolveStyle('arrowDown', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.fillStyle = hexWithAlpha(s.fillColor, s.fillOpacity);\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        // Vertical line from (x, y-10) to (x, y+2)\n        ctx.beginPath();\n        ctx.moveTo(x, y - 10);\n        ctx.lineTo(x, y + 2);\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        // Arrowhead pointing down: triangle at bottom (x, y+10)\n        const tipX = x;\n        const tipY = y + 10;\n        const halfBase = 6;\n        ctx.beginPath();\n        ctx.moveTo(tipX, tipY);\n        ctx.lineTo(tipX - halfBase, tipY - 10);\n        ctx.lineTo(tipX + halfBase, tipY - 10);\n        ctx.closePath();\n        ctx.fill();\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        const ax = scale.xToPixel(this.points[0].barIndex, viewport, chartW);\n        const ay = scale.yToPixel(this.points[0].price, priceRange, chartH);\n        return Math.hypot(x - ax, y - ay) <= 12;\n    }\n\n    getHandle(): DrawingHandle | null {\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class HeadShoulders implements IDrawing {\n    readonly id: string;\n    readonly type = 'headShoulders' as const;\n    readonly requiredPoints = 5;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `hs_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        // Labels: [LS, H, RS, L1, L2]\n        // Points: 0=LS, 1=H, 2=RS, 3=L1, 4=L2\n        const labels = ['LS', 'H', 'RS', 'L1', 'L2'];\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        const n = px.length;\n\n        const s = resolveStyle('headShoulders', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        // Main pattern segments: LS(0)→L1(3)→H(1)→L2(4)→RS(2)\n        // Only draw segments for points that exist\n        // We'll draw the zigzag path based on available points\n        const zigzagOrder = [0, 3, 1, 4, 2];\n        const availableZigzag = zigzagOrder.filter(i => i < n);\n\n        if (availableZigzag.length >= 2) {\n            ctx.beginPath();\n            ctx.moveTo(px[availableZigzag[0]], py[availableZigzag[0]]);\n            for (let i = 1; i < availableZigzag.length; i++) {\n                ctx.lineTo(px[availableZigzag[i]], py[availableZigzag[i]]);\n            }\n            ctx.stroke();\n        }\n        ctx.setLineDash([]);\n\n        // Fill the pattern lightly when complete\n        if (this.complete && n === 5) {\n            ctx.beginPath();\n            ctx.moveTo(px[0], py[0]);\n            ctx.lineTo(px[3], py[3]);\n            ctx.lineTo(px[1], py[1]);\n            ctx.lineTo(px[4], py[4]);\n            ctx.lineTo(px[2], py[2]);\n            ctx.closePath();\n            ctx.fillStyle = hexWithAlpha(s.fillColor, s.fillOpacity);\n            ctx.fill();\n        }\n\n        // Neckline: dashed line from L1(3) to L2(4) — only when both exist\n        if (n >= 5) {\n            ctx.save();\n            ctx.setLineDash([5, 4]);\n            ctx.strokeStyle = s.strokeColor;\n            ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n            ctx.beginPath();\n            ctx.moveTo(px[3], py[3]);\n            ctx.lineTo(px[4], py[4]);\n            ctx.stroke();\n            ctx.restore();\n        }\n\n        // Vertex dots and labels\n        ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n        ctx.fillStyle = s.strokeColor;\n        for (let i = 0; i < n; i++) {\n            ctx.beginPath();\n            ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n            ctx.fill();\n            ctx.fillText(labels[i] ?? String(i), px[i] + 5, py[i] - 5);\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        const n = px.length;\n\n        // Check zigzag segments: LS(0)→L1(3)→H(1)→L2(4)→RS(2)\n        const zigzagOrder = [0, 3, 1, 4, 2];\n        const availableZigzag = zigzagOrder.filter(i => i < n);\n        for (let i = 0; i < availableZigzag.length - 1; i++) {\n            const a = availableZigzag[i];\n            const b = availableZigzag[i + 1];\n            if (pointToSegmentDist(x, y, px[a], py[a], px[b], py[b]) <= HIT_TOLERANCE) return true;\n        }\n\n        // Check neckline\n        if (n >= 5 && pointToSegmentDist(x, y, px[3], py[3], px[4], py[4]) <= HIT_TOLERANCE) return true;\n\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length !== this.requiredPoints) return null;\n        for (let i = 0; i < this.points.length; i++) {\n            const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n            const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n            if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class TrianglePattern implements IDrawing {\n    readonly id: string;\n    readonly type = 'trianglePattern' as const;\n    readonly requiredPoints = 5;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `tpat_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        // Points: 0=1, 1=2, 2=3, 3=4, 4=5\n        const labels = ['1', '2', '3', '4', '5'];\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        const n = px.length;\n\n        const s = resolveStyle('trianglePattern', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        // Main path: 1→2→3→4→5\n        ctx.beginPath();\n        ctx.moveTo(px[0], py[0]);\n        for (let i = 1; i < n; i++) {\n            ctx.lineTo(px[i], py[i]);\n        }\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        // Dashed upper trendline: 1(0)→3(2)→5(4)\n        if (n >= 3) {\n            ctx.save();\n            ctx.setLineDash([5, 4]);\n            ctx.strokeStyle = s.strokeColor;\n            ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n            ctx.beginPath();\n            ctx.moveTo(px[0], py[0]);\n            ctx.lineTo(px[2], py[2]);\n            if (n >= 5) ctx.lineTo(px[4], py[4]);\n            ctx.stroke();\n            ctx.restore();\n        }\n\n        // Dashed lower trendline: 2(1)→4(3)\n        if (n >= 4) {\n            ctx.save();\n            ctx.setLineDash([5, 4]);\n            ctx.strokeStyle = s.strokeColor;\n            ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n            ctx.beginPath();\n            ctx.moveTo(px[1], py[1]);\n            ctx.lineTo(px[3], py[3]);\n            ctx.stroke();\n            ctx.restore();\n        }\n\n        // Vertex dots and labels\n        ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n        ctx.fillStyle = s.strokeColor;\n        for (let i = 0; i < n; i++) {\n            ctx.beginPath();\n            ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n            ctx.fill();\n            ctx.fillText(labels[i] ?? String(i + 1), px[i] + 5, py[i] - 5);\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        const n = px.length;\n\n        // Check main path segments\n        for (let i = 0; i < n - 1; i++) {\n            if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n        }\n\n        // Check upper trendline segments 1→3, 3→5\n        if (n >= 3 && pointToSegmentDist(x, y, px[0], py[0], px[2], py[2]) <= HIT_TOLERANCE) return true;\n        if (n >= 5 && pointToSegmentDist(x, y, px[2], py[2], px[4], py[4]) <= HIT_TOLERANCE) return true;\n\n        // Check lower trendline 2→4\n        if (n >= 4 && pointToSegmentDist(x, y, px[1], py[1], px[3], py[3]) <= HIT_TOLERANCE) return true;\n\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length !== this.requiredPoints) return null;\n        for (let i = 0; i < this.points.length; i++) {\n            const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n            const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n            if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class ThreeDrives implements IDrawing {\n    readonly id: string;\n    readonly type = 'threeDrives' as const;\n    readonly requiredPoints = 7;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `td_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        // Labels: O=origin, A=first drive, B=retracement, C=second drive, D=retracement, E=third drive, F=end\n        const labels = ['O', 'A', 'B', 'C', 'D', 'E', 'F'];\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        const n = px.length;\n\n        const s = resolveStyle('threeDrives', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        // Draw all connected segments in order\n        ctx.beginPath();\n        ctx.moveTo(px[0], py[0]);\n        for (let i = 1; i < n; i++) {\n            ctx.lineTo(px[i], py[i]);\n        }\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        // Light fill between the zigzag when complete\n        if (this.complete && n === 7) {\n            ctx.beginPath();\n            ctx.moveTo(px[0], py[0]);\n            for (let i = 1; i < n; i++) {\n                ctx.lineTo(px[i], py[i]);\n            }\n            ctx.closePath();\n            ctx.fillStyle = hexWithAlpha(s.fillColor, s.fillOpacity);\n            ctx.fill();\n        }\n\n        // Vertex dots and labels\n        ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n        ctx.fillStyle = s.strokeColor;\n        for (let i = 0; i < n; i++) {\n            ctx.beginPath();\n            ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n            ctx.fill();\n            ctx.fillText(labels[i] ?? String(i), px[i] + 5, py[i] - 5);\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        const n = px.length;\n\n        for (let i = 0; i < n - 1; i++) {\n            if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n        }\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length !== this.requiredPoints) return null;\n        for (let i = 0; i < this.points.length; i++) {\n            const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n            const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n            if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class AbcdPattern implements IDrawing {\n    readonly id: string;\n    readonly type = 'abcdPattern' as const;\n    readonly requiredPoints = 4;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `abcd_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const labels = ['A', 'B', 'C', 'D'];\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        const n = px.length;\n\n        const s = resolveStyle('abcdPattern', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        // Main zigzag: A→B→C→D\n        ctx.beginPath();\n        ctx.moveTo(px[0], py[0]);\n        for (let i = 1; i < n; i++) {\n            ctx.lineTo(px[i], py[i]);\n        }\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        // Dotted line from A(0) to D(3) to show the full range\n        if (n >= 4) {\n            ctx.save();\n            ctx.setLineDash([3, 4]);\n            ctx.strokeStyle = s.strokeColor;\n            ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n            ctx.beginPath();\n            ctx.moveTo(px[0], py[0]);\n            ctx.lineTo(px[3], py[3]);\n            ctx.stroke();\n            ctx.restore();\n        }\n\n        // Vertex dots and labels\n        ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n        ctx.fillStyle = s.strokeColor;\n        for (let i = 0; i < n; i++) {\n            ctx.beginPath();\n            ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n            ctx.fill();\n            ctx.fillText(labels[i] ?? String(i), px[i] + 5, py[i] - 5);\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        const n = px.length;\n\n        for (let i = 0; i < n - 1; i++) {\n            if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n        }\n\n        // Check A→D dotted line\n        if (n >= 4 && pointToSegmentDist(x, y, px[0], py[0], px[3], py[3]) <= HIT_TOLERANCE) return true;\n\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length !== this.requiredPoints) return null;\n        for (let i = 0; i < this.points.length; i++) {\n            const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n            const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n            if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class CypherPattern implements IDrawing {\n    readonly id: string;\n    readonly type = 'cypherPattern' as const;\n    readonly requiredPoints = 5;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `cyp_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const labels = ['X', 'A', 'B', 'C', 'D'];\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        const n = px.length;\n\n        const s = resolveStyle('cypherPattern', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        // Main zigzag: X→A→B→C→D\n        ctx.beginPath();\n        ctx.moveTo(px[0], py[0]);\n        for (let i = 1; i < n; i++) {\n            ctx.lineTo(px[i], py[i]);\n        }\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        // Light fill under the pattern when complete\n        if (this.complete && n === 5) {\n            ctx.beginPath();\n            ctx.moveTo(px[0], py[0]);\n            for (let i = 1; i < n; i++) {\n                ctx.lineTo(px[i], py[i]);\n            }\n            ctx.closePath();\n            ctx.fillStyle = hexWithAlpha(s.fillColor, s.fillOpacity);\n            ctx.fill();\n        }\n\n        // Vertex dots and labels\n        ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n        ctx.fillStyle = s.strokeColor;\n        for (let i = 0; i < n; i++) {\n            ctx.beginPath();\n            ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n            ctx.fill();\n            ctx.fillText(labels[i] ?? String(i), px[i] + 5, py[i] - 5);\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        const n = px.length;\n\n        for (let i = 0; i < n - 1; i++) {\n            if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n        }\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length !== this.requiredPoints) return null;\n        for (let i = 0; i < this.points.length; i++) {\n            const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n            const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n            if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class ButterflyPattern implements IDrawing {\n    readonly id: string;\n    readonly type = 'butterflyPattern' as const;\n    readonly requiredPoints = 5;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `bfly_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const labels = ['X', 'A', 'B', 'C', 'D'];\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        const n = px.length;\n\n        const s = resolveStyle('butterflyPattern', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        // Main zigzag: X→A→B→C→D\n        ctx.beginPath();\n        ctx.moveTo(px[0], py[0]);\n        for (let i = 1; i < n; i++) {\n            ctx.lineTo(px[i], py[i]);\n        }\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        // Dashed XD line (completion zone) — only when both X(0) and D(4) exist\n        if (n >= 5) {\n            ctx.save();\n            ctx.setLineDash([5, 4]);\n            ctx.strokeStyle = s.strokeColor;\n            ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n            ctx.beginPath();\n            ctx.moveTo(px[0], py[0]);\n            ctx.lineTo(px[4], py[4]);\n            ctx.stroke();\n            ctx.restore();\n        }\n\n        // Vertex dots and labels\n        ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n        ctx.fillStyle = s.strokeColor;\n        for (let i = 0; i < n; i++) {\n            ctx.beginPath();\n            ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n            ctx.fill();\n            ctx.fillText(labels[i] ?? String(i), px[i] + 5, py[i] - 5);\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        const n = px.length;\n\n        for (let i = 0; i < n - 1; i++) {\n            if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n        }\n\n        // Check XD dashed line\n        if (n >= 5 && pointToSegmentDist(x, y, px[0], py[0], px[4], py[4]) <= HIT_TOLERANCE) return true;\n\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length !== this.requiredPoints) return null;\n        for (let i = 0; i < this.points.length; i++) {\n            const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n            const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n            if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class BatPattern implements IDrawing {\n    readonly id: string;\n    readonly type = 'batPattern' as const;\n    readonly requiredPoints = 5;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `bat_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const labels = ['X', 'A', 'B', 'C', 'D'];\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        const n = px.length;\n\n        const s = resolveStyle('batPattern', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        // Main zigzag: X→A→B→C→D\n        ctx.beginPath();\n        ctx.moveTo(px[0], py[0]);\n        for (let i = 1; i < n; i++) {\n            ctx.lineTo(px[i], py[i]);\n        }\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        // Dashed XD line\n        if (n >= 5) {\n            ctx.save();\n            ctx.setLineDash([5, 4]);\n            ctx.strokeStyle = s.strokeColor;\n            ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n            ctx.beginPath();\n            ctx.moveTo(px[0], py[0]);\n            ctx.lineTo(px[4], py[4]);\n            ctx.stroke();\n            ctx.restore();\n        }\n\n        // Vertex dots and labels\n        ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n        ctx.fillStyle = s.strokeColor;\n        for (let i = 0; i < n; i++) {\n            ctx.beginPath();\n            ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n            ctx.fill();\n            ctx.fillText(labels[i] ?? String(i), px[i] + 5, py[i] - 5);\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        const n = px.length;\n\n        for (let i = 0; i < n - 1; i++) {\n            if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n        }\n\n        // Check XD dashed line\n        if (n >= 5 && pointToSegmentDist(x, y, px[0], py[0], px[4], py[4]) <= HIT_TOLERANCE) return true;\n\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length !== this.requiredPoints) return null;\n        for (let i = 0; i < this.points.length; i++) {\n            const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n            const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n            if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class GartleyPattern implements IDrawing {\n    readonly id: string;\n    readonly type = 'gartleyPattern' as const;\n    readonly requiredPoints = 5;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `gart_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const labels = ['X', 'A', 'B', 'C', 'D'];\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        const n = px.length;\n\n        const s = resolveStyle('gartleyPattern', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        // Main zigzag: X→A→B→C→D\n        ctx.beginPath();\n        ctx.moveTo(px[0], py[0]);\n        for (let i = 1; i < n; i++) {\n            ctx.lineTo(px[i], py[i]);\n        }\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        // Dashed XD line\n        if (n >= 5) {\n            ctx.save();\n            ctx.setLineDash([5, 4]);\n            ctx.strokeStyle = s.strokeColor;\n            ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n            ctx.beginPath();\n            ctx.moveTo(px[0], py[0]);\n            ctx.lineTo(px[4], py[4]);\n            ctx.stroke();\n            ctx.restore();\n        }\n\n        // Vertex dots and labels\n        ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n        ctx.fillStyle = s.strokeColor;\n        for (let i = 0; i < n; i++) {\n            ctx.beginPath();\n            ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n            ctx.fill();\n            ctx.fillText(labels[i] ?? String(i), px[i] + 5, py[i] - 5);\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        const n = px.length;\n\n        for (let i = 0; i < n - 1; i++) {\n            if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n        }\n\n        // Check XD dashed line\n        if (n >= 5 && pointToSegmentDist(x, y, px[0], py[0], px[4], py[4]) <= HIT_TOLERANCE) return true;\n\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length !== this.requiredPoints) return null;\n        for (let i = 0; i < this.points.length; i++) {\n            const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n            const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n            if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class CrabPattern implements IDrawing {\n    readonly id: string;\n    readonly type = 'crabPattern' as const;\n    readonly requiredPoints = 5;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `crab_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const labels = ['X', 'A', 'B', 'C', 'D'];\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        const n = px.length;\n\n        const s = resolveStyle('crabPattern', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        // Main zigzag: X→A→B→C→D\n        ctx.beginPath();\n        ctx.moveTo(px[0], py[0]);\n        for (let i = 1; i < n; i++) {\n            ctx.lineTo(px[i], py[i]);\n        }\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        // Dashed XD line\n        if (n >= 5) {\n            ctx.save();\n            ctx.setLineDash([5, 4]);\n            ctx.strokeStyle = s.strokeColor;\n            ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n            ctx.beginPath();\n            ctx.moveTo(px[0], py[0]);\n            ctx.lineTo(px[4], py[4]);\n            ctx.stroke();\n            ctx.restore();\n        }\n\n        // Vertex dots and labels\n        ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n        ctx.fillStyle = s.strokeColor;\n        for (let i = 0; i < n; i++) {\n            ctx.beginPath();\n            ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n            ctx.fill();\n            ctx.fillText(labels[i] ?? String(i), px[i] + 5, py[i] - 5);\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        const n = px.length;\n\n        for (let i = 0; i < n - 1; i++) {\n            if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n        }\n\n        // Check XD dashed line\n        if (n >= 5 && pointToSegmentDist(x, y, px[0], py[0], px[4], py[4]) <= HIT_TOLERANCE) return true;\n\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length !== this.requiredPoints) return null;\n        for (let i = 0; i < this.points.length; i++) {\n            const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n            const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n            if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class SharkPattern implements IDrawing {\n    readonly id: string;\n    readonly type = 'sharkPattern' as const;\n    readonly requiredPoints = 5;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `shrk_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const labels = ['X', 'A', 'B', 'C', 'D'];\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        const n = px.length;\n\n        const s = resolveStyle('sharkPattern', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        // Main zigzag: X→A→B→C→D\n        ctx.beginPath();\n        ctx.moveTo(px[0], py[0]);\n        for (let i = 1; i < n; i++) {\n            ctx.lineTo(px[i], py[i]);\n        }\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        // Dashed XD line\n        if (n >= 5) {\n            ctx.save();\n            ctx.setLineDash([5, 4]);\n            ctx.strokeStyle = s.strokeColor;\n            ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n            ctx.beginPath();\n            ctx.moveTo(px[0], py[0]);\n            ctx.lineTo(px[4], py[4]);\n            ctx.stroke();\n            ctx.restore();\n        }\n\n        // Vertex dots and labels\n        ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n        ctx.fillStyle = s.strokeColor;\n        for (let i = 0; i < n; i++) {\n            ctx.beginPath();\n            ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n            ctx.fill();\n            ctx.fillText(labels[i] ?? String(i), px[i] + 5, py[i] - 5);\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        const n = px.length;\n\n        for (let i = 0; i < n - 1; i++) {\n            if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n        }\n\n        // Check XD dashed line\n        if (n >= 5 && pointToSegmentDist(x, y, px[0], py[0], px[4], py[4]) <= HIT_TOLERANCE) return true;\n\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length !== this.requiredPoints) return null;\n        for (let i = 0; i < this.points.length; i++) {\n            const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n            const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n            if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nconst LABELS = ['0', '1', '2', '3', '4', '5'];\n\nexport class ElliottImpulse implements IDrawing {\n    readonly id: string;\n    readonly type = 'elliottImpulse' as const;\n    readonly requiredPoints = 6;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `eimp_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        const n = px.length;\n\n        const s = resolveStyle('elliottImpulse', this.style, theme);\n\n        ctx.save();\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        // Draw segments with alternating alpha: impulse (0→1, 2→3, 4→5) brighter, corrective (1→2, 3→4) dimmer\n        for (let i = 0; i < n - 1; i++) {\n            const isImpulse = i % 2 === 0; // segments 0,2,4 are impulse waves\n            ctx.strokeStyle = isImpulse ? s.strokeColor : hexWithAlpha(s.strokeColor, 0.67);\n            ctx.beginPath();\n            ctx.moveTo(px[i], py[i]);\n            ctx.lineTo(px[i + 1], py[i + 1]);\n            ctx.stroke();\n        }\n        ctx.setLineDash([]);\n\n        // Vertex circles and labels\n        ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n        for (let i = 0; i < n; i++) {\n            ctx.beginPath();\n            ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n            ctx.fillStyle = s.strokeColor;\n            ctx.fill();\n            ctx.fillStyle = s.strokeColor;\n            ctx.fillText(LABELS[i] ?? String(i), px[i] + 5, py[i] - 5);\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        for (let i = 0; i < px.length - 1; i++) {\n            if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n        }\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (!this.complete) return null;\n        for (let i = 0; i < this.points.length; i++) {\n            const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n            const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n            if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) return { pointIndex: i, cursor: 'grab' };\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nconst LABELS = ['0', 'A', 'B', 'C'];\n\nexport class ElliottCorrective implements IDrawing {\n    readonly id: string;\n    readonly type = 'elliottCorrective' as const;\n    readonly requiredPoints = 4;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `ecor_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n\n        const s = resolveStyle('elliottCorrective', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n        ctx.beginPath();\n        ctx.moveTo(px[0], py[0]);\n        for (let i = 1; i < px.length; i++) ctx.lineTo(px[i], py[i]);\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n        for (let i = 0; i < px.length; i++) {\n            ctx.beginPath();\n            ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n            ctx.fillStyle = s.strokeColor;\n            ctx.fill();\n            ctx.fillStyle = s.strokeColor;\n            ctx.fillText(LABELS[i] ?? String(i), px[i] + 5, py[i] - 5);\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        for (let i = 0; i < px.length - 1; i++) {\n            if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n        }\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (!this.complete) return null;\n        for (let i = 0; i < this.points.length; i++) {\n            const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n            const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n            if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) return { pointIndex: i, cursor: 'grab' };\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nconst LABELS = ['A', 'B', 'C', 'D', 'E', 'end'];\n\nexport class ElliottTriangle implements IDrawing {\n    readonly id: string;\n    readonly type = 'elliottTriangle' as const;\n    readonly requiredPoints = 6;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `etri_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        const n = px.length;\n\n        const s = resolveStyle('elliottTriangle', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        // Main zigzag A→B→C→D→E→end\n        ctx.beginPath();\n        ctx.moveTo(px[0], py[0]);\n        for (let i = 1; i < n; i++) ctx.lineTo(px[i], py[i]);\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        // Dashed upper trendline: A(0)→C(2)→E(4)\n        if (n >= 3) {\n            ctx.save();\n            ctx.setLineDash([5, 4]);\n            ctx.strokeStyle = hexWithAlpha(s.strokeColor, 0.67);\n            ctx.lineWidth = s.lineWidth;\n            ctx.beginPath();\n            ctx.moveTo(px[0], py[0]);\n            if (n > 2) ctx.lineTo(px[2], py[2]);\n            if (n > 4) ctx.lineTo(px[4], py[4]);\n            ctx.stroke();\n            ctx.restore();\n        }\n\n        // Dashed lower trendline: B(1)→D(3)\n        if (n >= 4) {\n            ctx.save();\n            ctx.setLineDash([5, 4]);\n            ctx.strokeStyle = hexWithAlpha(s.strokeColor, 0.67);\n            ctx.lineWidth = s.lineWidth;\n            ctx.beginPath();\n            ctx.moveTo(px[1], py[1]);\n            ctx.lineTo(px[3], py[3]);\n            ctx.stroke();\n            ctx.restore();\n        }\n\n        // Vertex circles and labels\n        ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n        for (let i = 0; i < n; i++) {\n            ctx.beginPath();\n            ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n            ctx.fillStyle = s.strokeColor;\n            ctx.fill();\n            ctx.fillStyle = s.strokeColor;\n            ctx.fillText(LABELS[i] ?? String(i), px[i] + 5, py[i] - 5);\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        for (let i = 0; i < px.length - 1; i++) {\n            if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n        }\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (!this.complete) return null;\n        for (let i = 0; i < this.points.length; i++) {\n            const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n            const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n            if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) return { pointIndex: i, cursor: 'grab' };\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nconst LABELS = ['W', 'X', 'Y', 'X2', 'Z', 'X3', 'end'];\n\nexport class ElliottCombination implements IDrawing {\n    readonly id: string;\n    readonly type = 'elliottCombination' as const;\n    readonly requiredPoints = 7;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `ecom_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n\n        const s = resolveStyle('elliottCombination', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n        ctx.beginPath();\n        ctx.moveTo(px[0], py[0]);\n        for (let i = 1; i < px.length; i++) ctx.lineTo(px[i], py[i]);\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n        for (let i = 0; i < px.length; i++) {\n            ctx.beginPath();\n            ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n            ctx.fillStyle = s.strokeColor;\n            ctx.fill();\n            ctx.fillStyle = s.strokeColor;\n            ctx.fillText(LABELS[i] ?? String(i), px[i] + 5, py[i] - 5);\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        for (let i = 0; i < px.length - 1; i++) {\n            if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n        }\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (!this.complete) return null;\n        for (let i = 0; i < this.points.length; i++) {\n            const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n            const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n            if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) return { pointIndex: i, cursor: 'grab' };\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nconst LABELS = ['W', 'X', 'Y', 'end'];\n\nexport class ElliottWxy implements IDrawing {\n    readonly id: string;\n    readonly type = 'elliottWxy' as const;\n    readonly requiredPoints = 4;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `ewxy_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n\n        const s = resolveStyle('elliottWxy', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n        ctx.beginPath();\n        ctx.moveTo(px[0], py[0]);\n        for (let i = 1; i < px.length; i++) ctx.lineTo(px[i], py[i]);\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        ctx.font = \"11px 'Inter', system-ui, sans-serif\";\n        for (let i = 0; i < px.length; i++) {\n            ctx.beginPath();\n            ctx.arc(px[i], py[i], isSelected ? 4 : 3, 0, Math.PI * 2);\n            ctx.fillStyle = s.strokeColor;\n            ctx.fill();\n            ctx.fillStyle = s.strokeColor;\n            ctx.fillText(LABELS[i] ?? String(i), px[i] + 5, py[i] - 5);\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const px = this.points.map(p => scale.xToPixel(p.barIndex, viewport, chartW));\n        const py = this.points.map(p => scale.yToPixel(p.price, priceRange, chartH));\n        for (let i = 0; i < px.length - 1; i++) {\n            if (pointToSegmentDist(x, y, px[i], py[i], px[i + 1], py[i + 1]) <= HIT_TOLERANCE) return true;\n        }\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (!this.complete) return null;\n        for (let i = 0; i < this.points.length; i++) {\n            const hx = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n            const hy = scale.yToPixel(this.points[i].price, priceRange, chartH);\n            if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) return { pointIndex: i, cursor: 'grab' };\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle } from './styleUtils.js';\nconst HIT_TOLERANCE = 8;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class Brush implements IDrawing {\n    readonly id: string;\n    readonly type = 'brush' as const;\n    readonly openEnded = true;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `brush_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const pixelPts = this.points.map(p => ({\n            x: scale.xToPixel(p.barIndex, viewport, chartW),\n            y: scale.yToPixel(p.price, priceRange, chartH),\n        }));\n\n        const solidCount = this.complete ? pixelPts.length : pixelPts.length - 1;\n\n        const s = resolveStyle('brush', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        ctx.lineCap = 'round';\n        ctx.lineJoin = 'round';\n\n        // Draw confirmed segments\n        if (solidCount >= 2) {\n            ctx.setLineDash([]);\n            ctx.beginPath();\n            ctx.moveTo(pixelPts[0].x, pixelPts[0].y);\n            for (let i = 1; i < solidCount; i++) {\n                ctx.lineTo(pixelPts[i].x, pixelPts[i].y);\n            }\n            ctx.stroke();\n        }\n\n        // Draw the preview (last) segment as dashed when not complete\n        if (!this.complete && pixelPts.length >= 2) {\n            const last = pixelPts.length - 1;\n            ctx.setLineDash([4, 4]);\n            ctx.beginPath();\n            ctx.moveTo(pixelPts[last - 1].x, pixelPts[last - 1].y);\n            ctx.lineTo(pixelPts[last].x, pixelPts[last].y);\n            ctx.stroke();\n            ctx.setLineDash([]);\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n\n        const pixelPts = this.points.map(p => ({\n            x: scale.xToPixel(p.barIndex, viewport, chartW),\n            y: scale.yToPixel(p.price, priceRange, chartH),\n        }));\n\n        const segCount = this.complete ? pixelPts.length - 1 : pixelPts.length - 2;\n        for (let i = 0; i < segCount; i++) {\n            if (pointToSegmentDist(x, y, pixelPts[i].x, pixelPts[i].y, pixelPts[i + 1].x, pixelPts[i + 1].y) <= HIT_TOLERANCE) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length === 0) return null;\n\n        // Only expose first and last points as handles\n        const indices = [0, this.points.length - 1];\n        for (const i of indices) {\n            const px = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n            const py = scale.yToPixel(this.points[i].price, priceRange, chartH);\n            if (Math.hypot(x - px, y - py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, hexWithAlpha } from './styleUtils.js';\nconst HIT_TOLERANCE = 12;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class Highlighter implements IDrawing {\n    readonly id: string;\n    readonly type = 'highlighter' as const;\n    readonly openEnded = true;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `hl2_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const pixelPts = this.points.map(p => ({\n            x: scale.xToPixel(p.barIndex, viewport, chartW),\n            y: scale.yToPixel(p.price, priceRange, chartH),\n        }));\n\n        const solidCount = this.complete ? pixelPts.length : pixelPts.length - 1;\n\n        const s = resolveStyle('highlighter', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = hexWithAlpha(s.strokeColor, s.fillOpacity);\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        ctx.lineCap = 'round';\n        ctx.lineJoin = 'round';\n\n        // Draw confirmed segments\n        if (solidCount >= 2) {\n            ctx.setLineDash([]);\n            ctx.beginPath();\n            ctx.moveTo(pixelPts[0].x, pixelPts[0].y);\n            for (let i = 1; i < solidCount; i++) {\n                ctx.lineTo(pixelPts[i].x, pixelPts[i].y);\n            }\n            ctx.stroke();\n        }\n\n        // Draw the preview (last) segment as dashed when not complete\n        if (!this.complete && pixelPts.length >= 2) {\n            const last = pixelPts.length - 1;\n            ctx.setLineDash([8, 6]);\n            ctx.beginPath();\n            ctx.moveTo(pixelPts[last - 1].x, pixelPts[last - 1].y);\n            ctx.lineTo(pixelPts[last].x, pixelPts[last].y);\n            ctx.stroke();\n            ctx.setLineDash([]);\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n\n        const pixelPts = this.points.map(p => ({\n            x: scale.xToPixel(p.barIndex, viewport, chartW),\n            y: scale.yToPixel(p.price, priceRange, chartH),\n        }));\n\n        const segCount = this.complete ? pixelPts.length - 1 : pixelPts.length - 2;\n        for (let i = 0; i < segCount; i++) {\n            if (pointToSegmentDist(x, y, pixelPts[i].x, pixelPts[i].y, pixelPts[i + 1].x, pixelPts[i + 1].y) <= HIT_TOLERANCE) {\n                return true;\n            }\n        }\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length === 0) return null;\n\n        // Only expose first and last points as handles\n        const indices = [0, this.points.length - 1];\n        for (const i of indices) {\n            const px = scale.xToPixel(this.points[i].barIndex, viewport, chartW);\n            const py = scale.yToPixel(this.points[i].price, priceRange, chartH);\n            if (Math.hypot(x - px, y - py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\nconst HIT_TOLERANCE = 6;\n\nexport class SineLine implements IDrawing {\n    readonly id: string;\n    readonly type = 'sineLine' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `sine_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const period = x2 - x1;\n        const amplitude = Math.abs(y2 - y1) / 2;\n        const midY = (y1 + y2) / 2;\n\n        const s = resolveStyle('sineLine', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        ctx.beginPath();\n\n        if (Math.abs(period) < 1) {\n            // Degenerate: just draw a vertical line\n            ctx.moveTo(x1, y1);\n            ctx.lineTo(x2, y2);\n        } else {\n            ctx.moveTo(x1, midY + amplitude * Math.sin(0));\n            const step = period > 0 ? 1 : -1;\n            const xEnd = x2;\n            for (let x = x1 + step; (period > 0 ? x <= xEnd : x >= xEnd); x += step) {\n                const t = (x - x1) / period;\n                const y = midY + amplitude * Math.sin(2 * Math.PI * t);\n                ctx.lineTo(x, y);\n            }\n            // Ensure we hit the end point exactly\n            ctx.lineTo(x2, midY + amplitude * Math.sin(2 * Math.PI));\n        }\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        // Anchor dots at p1 and p2\n        ctx.fillStyle = s.strokeColor;\n        for (const [x, y] of [[x1, y1], [x2, y2]] as [number, number][]) {\n            ctx.beginPath();\n            ctx.arc(x, y, isSelected ? 4 : 3, 0, Math.PI * 2);\n            ctx.fill();\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const period = x2 - x1;\n        const amplitude = Math.abs(y2 - y1) / 2;\n        const midY = (y1 + y2) / 2;\n\n        if (Math.abs(period) < 1) {\n            return Math.hypot(x - x1, y - midY) <= HIT_TOLERANCE;\n        }\n\n        // Sample every 5 pixels along the sine wave\n        const step = period > 0 ? 5 : -5;\n        let prevSx = x1;\n        let prevSy = midY + amplitude * Math.sin(0);\n\n        for (let sx = x1 + step; (period > 0 ? sx <= x2 + Math.abs(step) : sx >= x2 - Math.abs(step)); sx += step) {\n            const clampedSx = period > 0 ? Math.min(sx, x2) : Math.max(sx, x2);\n            const t = (clampedSx - x1) / period;\n            const sy = midY + amplitude * Math.sin(2 * Math.PI * t);\n            if (Math.hypot(x - clampedSx, y - sy) <= HIT_TOLERANCE) return true;\n            // Also check segment between samples for better accuracy\n            const dx = clampedSx - prevSx, dy = sy - prevSy;\n            const lenSq = dx * dx + dy * dy;\n            if (lenSq > 0) {\n                const tt = Math.max(0, Math.min(1, ((x - prevSx) * dx + (y - prevSy) * dy) / lenSq));\n                const nearX = prevSx + tt * dx;\n                const nearY = prevSy + tt * dy;\n                if (Math.hypot(x - nearX, y - nearY) <= HIT_TOLERANCE) return true;\n            }\n            prevSx = clampedSx;\n            prevSy = sy;\n            if (clampedSx === x2) break;\n        }\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        const pts = [\n            { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n            { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n        ];\n        for (let i = 0; i < pts.length; i++) {\n            if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\nconst HIT_TOLERANCE = 6;\n\nexport class CyclicLines implements IDrawing {\n    readonly id: string;\n    readonly type = 'cyclicLines' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `cyc_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const cycleLen = Math.abs(p2.barIndex - p1.barIndex);\n        if (cycleLen === 0) return;\n\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n\n        const s = resolveStyle('cyclicLines', this.style, theme);\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth   = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        for (let i = 0; i <= 8; i++) {\n            const barIdx = p1.barIndex + cycleLen * i;\n            const x = scale.xToPixel(barIdx, viewport, chartW);\n            if (x > chartW) break;\n\n            ctx.beginPath();\n            ctx.moveTo(x, 0);\n            ctx.lineTo(x, chartH);\n            ctx.stroke();\n        }\n\n        ctx.setLineDash([]);\n\n        // Anchor dots\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        ctx.fillStyle = s.strokeColor;\n        ctx.beginPath();\n        ctx.arc(x1, chartH / 2, isSelected ? 4 : 3, 0, Math.PI * 2);\n        ctx.fill();\n        ctx.beginPath();\n        ctx.arc(x2, chartH / 2, isSelected ? 4 : 3, 0, Math.PI * 2);\n        ctx.fill();\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        _y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2] = this.points;\n        const cycleLen = Math.abs(p2.barIndex - p1.barIndex);\n        if (cycleLen === 0) return false;\n\n        for (let i = 0; i <= 8; i++) {\n            const barIdx = p1.barIndex + cycleLen * i;\n            const cx = scale.xToPixel(barIdx, viewport, chartW);\n            if (cx > chartW) break;\n            if (Math.abs(x - cx) <= HIT_TOLERANCE) return true;\n        }\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const pts = [\n            { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: chartH / 2 },\n            { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: chartH / 2 },\n        ];\n        const cursors = ['move', 'ew-resize'];\n        for (let i = 0; i < pts.length; i++) {\n            if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: cursors[i] };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\nconst HIT_TOLERANCE = 6;\n\nexport class TimeCycles implements IDrawing {\n    readonly id: string;\n    readonly type = 'timeCycles' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `tcy_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const cycleLen = Math.abs(p2.barIndex - p1.barIndex);\n        if (cycleLen === 0) return;\n\n        const s = resolveStyle('timeCycles', this.style, theme);\n        const maxLines = 6;\n        const bandFill = hexWithAlpha(s.fillColor, s.fillOpacity);\n\n        ctx.save();\n        ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n\n        // Collect line positions first\n        const lineXs: number[] = [];\n        for (let i = 0; i <= maxLines; i++) {\n            const barIdx = p1.barIndex + cycleLen * i;\n            const x = scale.xToPixel(barIdx, viewport, chartW);\n            if (x > chartW) break;\n            lineXs.push(x);\n        }\n\n        // Draw alternating shaded bands between consecutive cycle lines\n        for (let i = 0; i + 1 < lineXs.length; i++) {\n            if (i % 2 === 0) {\n                ctx.fillStyle = bandFill;\n                ctx.fillRect(lineXs[i], 0, lineXs[i + 1] - lineXs[i], chartH);\n            }\n        }\n\n        // Draw vertical lines (themed dash) with labels\n        ctx.strokeStyle = s.strokeColor;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n        for (let i = 0; i < lineXs.length; i++) {\n            ctx.beginPath();\n            ctx.moveTo(lineXs[i], 0);\n            ctx.lineTo(lineXs[i], chartH);\n            ctx.stroke();\n\n            // Label at the top of each line\n            ctx.fillStyle = s.strokeColor;\n            ctx.fillText(String(i + 1), lineXs[i] + 3, 14);\n        }\n        ctx.setLineDash([]);\n\n        // Anchor dots\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        ctx.fillStyle = s.strokeColor;\n        ctx.beginPath();\n        ctx.arc(x1, chartH / 2, isSelected ? 4 : 3, 0, Math.PI * 2);\n        ctx.fill();\n        ctx.beginPath();\n        ctx.arc(x2, chartH / 2, isSelected ? 4 : 3, 0, Math.PI * 2);\n        ctx.fill();\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        _y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2] = this.points;\n        const cycleLen = Math.abs(p2.barIndex - p1.barIndex);\n        if (cycleLen === 0) return false;\n\n        for (let i = 0; i <= 6; i++) {\n            const barIdx = p1.barIndex + cycleLen * i;\n            const cx = scale.xToPixel(barIdx, viewport, chartW);\n            if (cx > chartW) break;\n            // Hit on line itself or within shaded region\n            if (Math.abs(x - cx) <= HIT_TOLERANCE) return true;\n            // Check if within a band (between line i and line i+1)\n            if (i < 6) {\n                const nextBarIdx = p1.barIndex + cycleLen * (i + 1);\n                const nextX = scale.xToPixel(nextBarIdx, viewport, chartW);\n                if (x >= cx && x <= nextX) return true;\n            }\n        }\n        return false;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const pts = [\n            { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: chartH / 2 },\n            { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: chartH / 2 },\n        ];\n        const cursors = ['move', 'ew-resize'];\n        for (let i = 0; i < pts.length; i++) {\n            if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: cursors[i] };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle } from './styleUtils.js';\nconst HIT_TOLERANCE = 6;\n\nfunction pointToSegmentDist(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\n    const dx = x2 - x1, dy = y2 - y1;\n    const lenSq = dx * dx + dy * dy;\n    if (lenSq === 0) return Math.hypot(px - x1, py - y1);\n    const t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy) / lenSq));\n    return Math.hypot(px - (x1 + t * dx), py - (y1 + t * dy));\n}\n\nexport class Projection implements IDrawing {\n    readonly id: string;\n    readonly type = 'projection' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `proj_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const s = resolveStyle('projection', this.style, theme);\n        const dxLine = x2 - x1;\n\n        // Projected endpoint: extrapolate from p2 toward chartW\n        let xEnd: number;\n        let yEnd: number;\n        if (Math.abs(dxLine) < 0.001) {\n            // Vertical line — projection straight down\n            xEnd = x2;\n            yEnd = y2 + (y2 - y1);\n        } else {\n            const slope = (y2 - y1) / dxLine;\n            xEnd = chartW;\n            yEnd = y2 + slope * (chartW - x2);\n        }\n\n        ctx.save();\n        ctx.strokeStyle = s.strokeColor;\n        ctx.fillStyle   = s.strokeColor;\n        ctx.lineWidth   = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n\n        // Solid segment: p1 → p2\n        ctx.setLineDash([]);\n        ctx.beginPath();\n        ctx.moveTo(x1, y1);\n        ctx.lineTo(x2, y2);\n        ctx.stroke();\n\n        // Dashed/themed projection: p2 → extrapolated end\n        applyLineStyle(ctx, s.lineStyle === 'solid' ? 'dashed' : s.lineStyle, ctx.lineWidth);\n        ctx.beginPath();\n        ctx.moveTo(x2, y2);\n        ctx.lineTo(xEnd, yEnd);\n        ctx.stroke();\n        ctx.setLineDash([]);\n\n        // Anchor dots\n        ctx.beginPath();\n        ctx.arc(x1, y1, isSelected ? 4 : 3, 0, Math.PI * 2);\n        ctx.fill();\n        ctx.beginPath();\n        ctx.arc(x2, y2, isSelected ? 4 : 3, 0, Math.PI * 2);\n        ctx.fill();\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const dxLine = x2 - x1;\n        let xEnd: number, yEnd: number;\n        if (Math.abs(dxLine) < 0.001) {\n            xEnd = x2;\n            yEnd = y2 + (y2 - y1);\n        } else {\n            const slope = (y2 - y1) / dxLine;\n            xEnd = chartW;\n            yEnd = y2 + slope * (chartW - x2);\n        }\n\n        return (\n            pointToSegmentDist(x, y, x1, y1, x2, y2) <= HIT_TOLERANCE ||\n            pointToSegmentDist(x, y, x2, y2, xEnd, yEnd) <= HIT_TOLERANCE\n        );\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const pts = [\n            { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n            { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n        ];\n        for (let i = 0; i < pts.length; i++) {\n            if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'grab' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\nconst HIT_TOLERANCE = 6;\n\nfunction drawArrowhead(ctx: CanvasRenderingContext2D, fromX: number, fromY: number, toX: number, toY: number, size = 7): void {\n    const angle = Math.atan2(toY - fromY, toX - fromX);\n    ctx.beginPath();\n    ctx.moveTo(toX, toY);\n    ctx.lineTo(toX - size * Math.cos(angle - Math.PI / 6), toY - size * Math.sin(angle - Math.PI / 6));\n    ctx.lineTo(toX - size * Math.cos(angle + Math.PI / 6), toY - size * Math.sin(angle + Math.PI / 6));\n    ctx.closePath();\n    ctx.fill();\n}\n\nexport class PriceProjection implements IDrawing {\n    readonly id: string;\n    readonly type = 'priceProjection' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `pp_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        pricePrecision = 2,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const left   = Math.min(x1, x2);\n        const right  = Math.max(x1, x2);\n        const topY   = Math.min(y1, y2);\n        const botY   = Math.max(y1, y2);\n        const w      = right - left;\n        const h      = botY - topY;\n        const midX   = left + w / 2;\n        const midPrice = (p1.price + p2.price) / 2;\n\n        const s = resolveStyle('priceProjection', this.style, theme);\n\n        ctx.save();\n        ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n\n        // Light pink fill\n        ctx.fillStyle = hexWithAlpha(s.fillColor, s.fillOpacity);\n        ctx.fillRect(left, topY, w, h);\n\n        ctx.strokeStyle = s.strokeColor;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n\n        // Horizontal line at p1.price\n        ctx.beginPath();\n        ctx.moveTo(left, y1);\n        ctx.lineTo(right, y1);\n        ctx.stroke();\n\n        // Horizontal line at midpoint price\n        const yMid = scale.yToPixel(midPrice, priceRange, chartH);\n        ctx.beginPath();\n        ctx.moveTo(left, yMid);\n        ctx.lineTo(right, yMid);\n        ctx.stroke();\n\n        // Horizontal line at p2.price\n        ctx.beginPath();\n        ctx.moveTo(left, y2);\n        ctx.lineTo(right, y2);\n        ctx.stroke();\n\n        ctx.setLineDash([]);\n\n        // Labels on the right side\n        ctx.fillStyle = s.strokeColor;\n        ctx.fillText(p1.price.toFixed(pricePrecision), right + 4, y1 + 4);\n        ctx.fillText(midPrice.toFixed(pricePrecision),  right + 4, yMid + 4);\n        ctx.fillText(p2.price.toFixed(pricePrecision),  right + 4, y2 + 4);\n\n        // Bidirectional vertical arrow in the middle\n        ctx.fillStyle = s.strokeColor;\n        ctx.beginPath();\n        ctx.moveTo(midX, topY);\n        ctx.lineTo(midX, botY);\n        ctx.stroke();\n        drawArrowhead(ctx, midX, botY, midX, topY); // pointing up\n        drawArrowhead(ctx, midX, topY, midX, botY); // pointing down\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const left  = Math.min(x1, x2);\n        const right = Math.max(x1, x2);\n        const topY  = Math.min(y1, y2);\n        const botY  = Math.max(y1, y2);\n\n        return x >= left && x <= right && y >= topY && y <= botY;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const pts = [\n            { px: scale.xToPixel(this.points[0].barIndex, viewport, chartW), py: scale.yToPixel(this.points[0].price, priceRange, chartH) },\n            { px: scale.xToPixel(this.points[1].barIndex, viewport, chartW), py: scale.yToPixel(this.points[1].price, priceRange, chartH) },\n        ];\n        for (let i = 0; i < pts.length; i++) {\n            if (Math.hypot(x - pts[i].px, y - pts[i].py) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: i, cursor: 'ns-resize' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingPoint, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\nimport { resolveStyle, applyLineStyle, hexWithAlpha } from './styleUtils.js';\n\nconst HIT_TOLERANCE = 6;\n\nexport class GhostFeed implements IDrawing {\n    readonly id: string;\n    readonly type = 'ghostFeed' as const;\n    points: DrawingPoint[];\n    complete: boolean;\n    style?: AnyDrawingStyle;\n\n    constructor(first: DrawingPoint) {\n        this.id = `gfeed_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n        this.points = [first, { ...first }];\n        this.complete = false;\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n        isSelected: boolean,\n        _pricePrecision?: number,\n        theme?: ChartTheme,\n    ): void {\n        if (this.points.length < 2) return;\n\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const rx = Math.min(x1, x2);\n        const ry = Math.min(y1, y2);\n        const rw = Math.abs(x2 - x1);\n        const rh = Math.abs(y2 - y1);\n\n        const s = resolveStyle('ghostFeed', this.style, theme);\n\n        ctx.save();\n\n        // 1. Fill rectangle with very faint tint\n        ctx.fillStyle = hexWithAlpha(s.fillColor, s.fillOpacity);\n        ctx.fillRect(rx, ry, rw, rh);\n\n        // 2. Themed border (dotted by default)\n        ctx.strokeStyle = s.strokeColor;\n        ctx.lineWidth = isSelected ? s.lineWidth + 0.5 : s.lineWidth;\n        applyLineStyle(ctx, isSelected ? 'solid' : s.lineStyle, ctx.lineWidth);\n        ctx.strokeRect(rx, ry, rw, rh);\n        ctx.setLineDash([]);\n\n        // 3. Diagonal hatching lines (top-left to bottom-right, 20px spacing)\n        ctx.save();\n        ctx.beginPath();\n        ctx.rect(rx, ry, rw, rh);\n        ctx.clip();\n\n        ctx.strokeStyle = hexWithAlpha(s.strokeColor, 0.19);\n        ctx.lineWidth = 1;\n        ctx.setLineDash([4, 4]);\n\n        const step = 20;\n        const diagExtent = rw + rh;\n        for (let offset = -rh; offset <= diagExtent; offset += step) {\n            const lx1 = rx + offset;\n            const ly1 = ry;\n            const lx2 = rx + offset + rh;\n            const ly2 = ry + rh;\n            ctx.beginPath();\n            ctx.moveTo(lx1, ly1);\n            ctx.lineTo(lx2, ly2);\n            ctx.stroke();\n        }\n\n        ctx.setLineDash([]);\n        ctx.restore();\n\n        // 4. Label \"Ghost Feed\" in center\n        ctx.font = \"12px 'Inter', system-ui, sans-serif\";\n        ctx.fillStyle = s.strokeColor;\n        ctx.textAlign = 'center';\n        ctx.textBaseline = 'middle';\n        ctx.fillText('Ghost Feed', rx + rw / 2, ry + rh / 2);\n\n        // Corner handles when selected\n        if (isSelected) {\n            ctx.textAlign = 'left';\n            ctx.textBaseline = 'alphabetic';\n            for (const [cx, cy] of [[x1, y1], [x2, y2]] as [number, number][]) {\n                ctx.beginPath();\n                ctx.arc(cx, cy, 3.5, 0, Math.PI * 2);\n                ctx.fillStyle = s.strokeColor;\n                ctx.fill();\n            }\n        }\n\n        ctx.restore();\n    }\n\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): boolean {\n        if (this.points.length < 2) return false;\n        const [p1, p2] = this.points;\n        const x1 = scale.xToPixel(p1.barIndex, viewport, chartW);\n        const y1 = scale.yToPixel(p1.price, priceRange, chartH);\n        const x2 = scale.xToPixel(p2.barIndex, viewport, chartW);\n        const y2 = scale.yToPixel(p2.price, priceRange, chartH);\n\n        const rx = Math.min(x1, x2) - HIT_TOLERANCE;\n        const ry = Math.min(y1, y2) - HIT_TOLERANCE;\n        const rw = Math.abs(x2 - x1) + HIT_TOLERANCE * 2;\n        const rh = Math.abs(y2 - y1) + HIT_TOLERANCE * 2;\n\n        return x >= rx && x <= rx + rw && y >= ry && y <= ry + rh;\n    }\n\n    getHandle(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRange,\n        chartW: number,\n        chartH: number,\n    ): DrawingHandle | null {\n        if (this.points.length < 2) return null;\n        const handles: [number, number, number][] = [\n            [0, scale.xToPixel(this.points[0].barIndex, viewport, chartW), scale.yToPixel(this.points[0].price, priceRange, chartH)],\n            [1, scale.xToPixel(this.points[1].barIndex, viewport, chartW), scale.yToPixel(this.points[1].price, priceRange, chartH)],\n        ];\n        for (const [pi, hx, hy] of handles) {\n            if (Math.hypot(x - hx, y - hy) <= HIT_TOLERANCE + 2) {\n                return { pointIndex: pi, cursor: 'nwse-resize' };\n            }\n        }\n        return null;\n    }\n}\n","import type { AnyDrawingStyle, IDrawing, DrawingHandle, DrawingToolType, DrawingPoint, Viewport, PriceRange as PriceRangeData, SerializedDrawing } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { ChartTheme } from '../core/themes.js';\n\n// ── Lines & Channels ──────────────────────────────────────────────────────────\nimport { HorizontalLine }   from './HorizontalLine.js';\nimport { VerticalLine }     from './VerticalLine.js';\nimport { TrendLine }        from './TrendLine.js';\nimport { TrendAngle }       from './TrendAngle.js';\nimport { CrossLine }        from './CrossLine.js';\nimport { ParallelChannel }  from './ParallelChannel.js';\nimport { FlatChannel }      from './FlatChannel.js';\nimport { DisjointChannel }  from './DisjointChannel.js';\n// ── Fibonacci & Gann ──────────────────────────────────────────────────────────\nimport { FibRetracement }   from './FibRetracement.js';\nimport { FibExtension }     from './FibExtension.js';\nimport { FibChannel }       from './FibChannel.js';\nimport { FibTimezone }      from './FibTimezone.js';\nimport { FibCircles }       from './FibCircles.js';\nimport { FibSpiral }        from './FibSpiral.js';\nimport { FibFan }           from './FibFan.js';\nimport { FibProjection }    from './FibProjection.js';\nimport { GannFan }          from './GannFan.js';\nimport { GannSquare }       from './GannSquare.js';\nimport { GannBox }          from './GannBox.js';\n// ── Geometric Shapes ─────────────────────────────────────────────────────────\nimport { Rectangle }        from './Rectangle.js';\nimport { RotatedRectangle } from './RotatedRectangle.js';\nimport { Ellipse }          from './Ellipse.js';\nimport { Triangle }         from './Triangle.js';\nimport { Circle }           from './Circle.js';\nimport { Arc }              from './Arc.js';\nimport { Polyline }         from './Polyline.js';\nimport { Path }             from './Path.js';\n// ── Measurement ───────────────────────────────────────────────────────────────\nimport { PriceRange }       from './PriceRange.js';\nimport { DateRange }        from './DateRange.js';\nimport { DatePriceRange }   from './DatePriceRange.js';\nimport { Ruler }            from './Ruler.js';\n// ── Pitchfork ─────────────────────────────────────────────────────────────────\nimport { Pitchfork }        from './Pitchfork.js';\nimport { SchiffPitchfork }  from './SchiffPitchfork.js';\nimport { ModifiedSchiff }   from './ModifiedSchiff.js';\nimport { InsidePitchfork }  from './InsidePitchfork.js';\n// ── Volume & Statistical ──────────────────────────────────────────────────────\nimport { FixedRangeVP }     from './FixedRangeVP.js';\nimport { AnchoredVP }       from './AnchoredVP.js';\nimport { VolumeProfile }    from './VolumeProfile.js';\nimport { RegressionTrend }  from './RegressionTrend.js';\n// ── Annotations ───────────────────────────────────────────────────────────────\nimport { Text }             from './Text.js';\nimport { Callout }          from './Callout.js';\nimport { PriceLabel }       from './PriceLabel.js';\nimport { ArrowMarker }      from './ArrowMarker.js';\nimport { Flag }             from './Flag.js';\nimport { PriceNote }        from './PriceNote.js';\nimport { AnchoredNote }     from './AnchoredNote.js';\nimport { ArrowUp }          from './ArrowUp.js';\nimport { ArrowDown }        from './ArrowDown.js';\n// ── Pattern Recognition ───────────────────────────────────────────────────────\nimport { HeadShoulders }    from './HeadShoulders.js';\nimport { TrianglePattern }  from './TrianglePattern.js';\nimport { ThreeDrives }      from './ThreeDrives.js';\nimport { AbcdPattern }      from './AbcdPattern.js';\nimport { CypherPattern }    from './CypherPattern.js';\nimport { ButterflyPattern } from './ButterflyPattern.js';\nimport { BatPattern }       from './BatPattern.js';\nimport { GartleyPattern }   from './GartleyPattern.js';\nimport { CrabPattern }      from './CrabPattern.js';\nimport { SharkPattern }     from './SharkPattern.js';\n// ── Elliott Wave ──────────────────────────────────────────────────────────────\nimport { ElliottImpulse }     from './ElliottImpulse.js';\nimport { ElliottCorrective }  from './ElliottCorrective.js';\nimport { ElliottTriangle }    from './ElliottTriangle.js';\nimport { ElliottCombination } from './ElliottCombination.js';\nimport { ElliottWxy }         from './ElliottWxy.js';\n// ── Brush & Highlighter ───────────────────────────────────────────────────────\nimport { Brush }            from './Brush.js';\nimport { Highlighter }      from './Highlighter.js';\n// ── Advanced ──────────────────────────────────────────────────────────────────\nimport { SineLine }         from './SineLine.js';\nimport { CyclicLines }      from './CyclicLines.js';\nimport { TimeCycles }       from './TimeCycles.js';\nimport { Projection }       from './Projection.js';\nimport { PriceProjection }  from './PriceProjection.js';\nimport { GhostFeed }        from './GhostFeed.js';\n\ntype DrawingState = 'idle' | 'placing';\n\nconst TEXT_TOOL_TYPES = new Set<DrawingToolType>(['text', 'callout', 'anchoredNote']);\n\nexport class DrawingManager {\n    private drawings: IDrawing[] = [];\n    private activeDrawing: IDrawing | null = null;\n    private selectedDrawing: IDrawing | null = null;\n    private activeTool: DrawingToolType | null = null;\n    private state: DrawingState = 'idle';\n    private history: IDrawing[][] = [];\n    private redoStack: IDrawing[][] = [];\n    private onCompleteCallback: (() => void) | null = null;\n    /** Called after any completed state-mutating operation (drawing placed, moved, deleted, etc.). */\n    onDrawingsChange: (() => void) | null = null;\n    /** Called when a text-type drawing is first completed — ChartEngine shows the text input. */\n    onStartTextEdit: ((drawing: IDrawing) => void) | null = null;\n    /**\n     * Called after drag/resize mutates a drawing's points so ChartEngine can\n     * refresh each point's `timestamp` from the current dataStore. Required\n     * because DrawingManager has no access to the data layer, and drag\n     * reconstructs points from raw (barIndex, price) deltas that strip the\n     * original point's timestamp.\n     */\n    onPointsMutated: ((drawing: IDrawing) => void) | null = null;\n    /** Called whenever the selected drawing changes (including to/from null). */\n    onSelectionChange: ((drawing: IDrawing | null) => void) | null = null;\n    /** Set to true by ChartEngine while the text input is focused — prevents Delete/Backspace from deleting the drawing. */\n    private editingText: boolean = false;\n\n    /** Centralizes selection mutation + change notification. */\n    private setSelected(drawing: IDrawing | null): void {\n        if (this.selectedDrawing === drawing) return;\n        this.selectedDrawing = drawing;\n        this.onSelectionChange?.(drawing);\n    }\n\n    // Drag state (move whole drawing)\n    private dragDrawing: IDrawing | null = null;\n    private dragStartMouse: DrawingPoint | null = null;\n    private dragStartPoints: DrawingPoint[] | null = null;\n\n    // Resize state (move single control point)\n    private resizeDrawing: IDrawing | null = null;\n    private resizePointIndex: number = -1;\n\n    /** Called by ChartEngine to be notified when a drawing is finished. */\n    setOnComplete(cb: () => void): void {\n        this.onCompleteCallback = cb;\n    }\n\n    /** Toggle the text-editing guard so Delete/Backspace are not intercepted. */\n    setEditingText(editing: boolean): void {\n        this.editingText = editing;\n    }\n\n    // ── Tool selection ────────────────────────────────────────────────────────\n\n    setActiveTool(tool: DrawingToolType | null): void {\n        if (this.state === 'placing' && this.activeDrawing) {\n            this.drawings.pop();\n        }\n        this.activeTool = tool;\n        this.state = 'idle';\n        this.activeDrawing = null;\n    }\n\n    getActiveTool(): DrawingToolType | null {\n        return this.activeTool;\n    }\n\n    // ── Mouse events (called from ChartEngine) ───────────────────────────────\n\n    /** Returns true if the drawing system consumed the event */\n    onMouseDown(point: DrawingPoint): boolean {\n        if (!this.activeTool) {\n            return false;\n        }\n\n        if (this.state === 'idle') {\n            this.snapshot();\n            this.activeDrawing = this.createDrawing(this.activeTool, point);\n            this.drawings.push(this.activeDrawing);\n            if (this.activeDrawing.complete) {\n                // Single-click tool (e.g. horizontalLine, verticalLine, crossLine, text)\n                const completed = this.activeDrawing;\n                this.setSelected(completed);\n                this.activeDrawing = null;\n                this.activeTool = null;\n                this.onCompleteCallback?.();\n                this.notifyChange();\n                if (TEXT_TOOL_TYPES.has(completed.type)) {\n                    this.onStartTextEdit?.(completed);\n                }\n            } else {\n                this.state = 'placing';\n            }\n            return true;\n        }\n\n        if (this.state === 'placing' && this.activeDrawing) {\n            const isOpenEnded: boolean = (this.activeDrawing as any).openEnded ?? false;\n\n            if (isOpenEnded) {\n                // Open-ended tool (Polyline, Path, Brush, Highlighter):\n                // Confirm current preview point and add a new one.\n                const last = this.activeDrawing.points.length - 1;\n                this.activeDrawing.points[last] = { ...point };\n                this.activeDrawing.points.push({ ...point });\n                return true;\n            }\n\n            const required: number = (this.activeDrawing as any).requiredPoints ?? 2;\n            const current = this.activeDrawing.points.length;\n\n            // Confirm the current preview point\n            this.activeDrawing.points[current - 1] = { ...point };\n\n            if (current < required) {\n                // More points needed — add a new preview point\n                this.activeDrawing.points.push({ ...point });\n                return true;\n            }\n\n            // All points placed — complete\n            this.activeDrawing.complete = true;\n            const completed = this.activeDrawing;\n            this.setSelected(completed);\n            this.activeDrawing = null;\n            this.state = 'idle';\n            this.activeTool = null;\n            this.onCompleteCallback?.();\n            this.notifyChange();\n            if (TEXT_TOOL_TYPES.has(completed.type)) {\n                this.onStartTextEdit?.(completed);\n            }\n            return true;\n        }\n\n        return false;\n    }\n\n    onMouseMove(point: DrawingPoint): void {\n        if (this.state === 'placing' && this.activeDrawing) {\n            const last = this.activeDrawing.points.length - 1;\n            this.activeDrawing.points[last] = point;\n        }\n        if (this.dragDrawing && this.dragStartMouse && this.dragStartPoints) {\n            const dBar   = point.barIndex - this.dragStartMouse.barIndex;\n            const dPrice = point.price    - this.dragStartMouse.price;\n            for (let i = 0; i < this.dragDrawing.points.length; i++) {\n                const start = this.dragStartPoints[i];\n                if (!start) continue;\n                this.dragDrawing.points[i] = {\n                    barIndex: start.barIndex + dBar,\n                    price:    start.price    + dPrice,\n                };\n            }\n            // Timestamps were stripped by the delta reconstruction above —\n            // let ChartEngine re-derive them from the current dataStore.\n            this.onPointsMutated?.(this.dragDrawing);\n        }\n        if (this.resizeDrawing && this.resizePointIndex >= 0) {\n            this.resizeDrawing.points[this.resizePointIndex] = { ...point };\n            // Incoming `point` carries its timestamp (ChartEngine.makeDrawingPoint),\n            // but fire the hook anyway so a resize that lands on a fractional barIndex\n            // gets a fresh, interpolated timestamp in case the caller didn't populate one.\n            this.onPointsMutated?.(this.resizeDrawing);\n        }\n    }\n\n    /**\n     * Finalizes an open-ended drawing (Polyline, Path, Brush, Highlighter)\n     * on double-click. Removes the dangling preview point and marks complete.\n     */\n    finalizePlacing(): void {\n        if (this.state !== 'placing' || !this.activeDrawing) return;\n        const isOpenEnded: boolean = (this.activeDrawing as any).openEnded ?? false;\n        if (!isOpenEnded) return;\n\n        // Remove the last preview point (was tracking mouse)\n        if (this.activeDrawing.points.length > 2) {\n            this.activeDrawing.points.pop();\n        }\n        if (this.activeDrawing.points.length < 2) {\n            this.drawings.pop();\n            this.activeDrawing = null;\n            this.state = 'idle';\n            this.activeTool = null;\n            return;\n        }\n        this.activeDrawing.complete = true;\n        this.setSelected(this.activeDrawing);\n        this.activeDrawing = null;\n        this.state = 'idle';\n        this.activeTool = null;\n        this.onCompleteCallback?.();\n        this.notifyChange();\n    }\n\n    startDrag(drawing: IDrawing, mouse: DrawingPoint): void {\n        this.snapshot();\n        this.dragDrawing     = drawing;\n        this.dragStartMouse  = { ...mouse };\n        this.dragStartPoints = drawing.points.map(p => ({ ...p }));\n    }\n\n    endDrag(): void {\n        this.dragDrawing     = null;\n        this.dragStartMouse  = null;\n        this.dragStartPoints = null;\n        this.notifyChange();\n    }\n\n    isDraggingDrawing(): boolean {\n        return this.dragDrawing !== null;\n    }\n\n    /** True when a multi-point drawing has been started and is awaiting further touch/click input. */\n    isPlacing(): boolean {\n        return this.state === 'placing';\n    }\n\n    startResize(drawing: IDrawing, pointIndex: number): void {\n        this.snapshot();\n        this.resizeDrawing    = drawing;\n        this.resizePointIndex = pointIndex;\n    }\n\n    endResize(): void {\n        this.resizeDrawing    = null;\n        this.resizePointIndex = -1;\n        this.notifyChange();\n    }\n\n    isResizingDrawing(): boolean {\n        return this.resizeDrawing !== null;\n    }\n\n    /** Shift all drawings' barIndex values by `delta` (called when bars are prepended to DataStore). */\n    shiftBarIndices(delta: number): void {\n        for (const drawing of this.drawings) {\n            for (const pt of drawing.points) {\n                pt.barIndex += delta;\n            }\n        }\n        if (this.dragStartPoints) {\n            for (const pt of this.dragStartPoints) {\n                pt.barIndex += delta;\n            }\n        }\n    }\n\n    /** Returns the handle under (x,y) across all complete drawings, or null */\n    getHandleAtPoint(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRangeData,\n        chartW: number,\n        chartH: number,\n    ): { drawing: IDrawing; handle: DrawingHandle } | null {\n        for (let i = this.drawings.length - 1; i >= 0; i--) {\n            const d = this.drawings[i];\n            if (!d.complete || d.visible === false || d.locked) continue;\n            const h = d.getHandle(x, y, scale, viewport, priceRange, chartW, chartH);\n            if (h) return { drawing: d, handle: h };\n        }\n        return null;\n    }\n\n    /** Returns the drawing that was hit, or null */\n    hitTest(\n        x: number,\n        y: number,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRangeData,\n        chartW: number,\n        chartH: number,\n    ): IDrawing | null {\n        for (let i = this.drawings.length - 1; i >= 0; i--) {\n            const d = this.drawings[i];\n            if (d.visible === false || d.locked) continue;\n            if (d.hitTest(x, y, scale, viewport, priceRange, chartW, chartH)) {\n                return d;\n            }\n        }\n        return null;\n    }\n\n    selectDrawing(drawing: IDrawing | null): void {\n        this.setSelected(drawing);\n    }\n\n    getSelectedDrawing(): IDrawing | null {\n        return this.selectedDrawing;\n    }\n\n    /** Returns a drawing by id, or null if not found. */\n    getDrawingById(id: string): IDrawing | null {\n        return this.drawings.find(d => d.id === id) ?? null;\n    }\n\n    /**\n     * Shallow-merge a style patch into the drawing's `style` field. Triggers\n     * `onDrawingsChange` so the chart re-renders. Returns the updated drawing,\n     * or null if no drawing matches `id`.\n     */\n    updateDrawingStyle(id: string, patch: Partial<AnyDrawingStyle>): IDrawing | null {\n        const drawing = this.getDrawingById(id);\n        if (!drawing) return null;\n        drawing.style = { ...(drawing.style ?? {}), ...patch } as AnyDrawingStyle;\n        // Deep-merge fib `levels` so single-level overrides don't drop siblings.\n        const patchLevels = (patch as { levels?: Record<string, { visible: boolean; color: string }> }).levels;\n        const existingLevels = (drawing.style as { levels?: Record<string, { visible: boolean; color: string }> }).levels;\n        if (patchLevels && existingLevels) {\n            (drawing.style as { levels?: Record<string, { visible: boolean; color: string }> }).levels = {\n                ...existingLevels,\n                ...patchLevels,\n            };\n        }\n        this.notifyChange();\n        return drawing;\n    }\n\n    // ── Keyboard shortcuts ────────────────────────────────────────────────────\n\n    onKeyDown(key: string): boolean {\n        if (key === 'Escape') {\n            if (this.state === 'placing' && this.activeDrawing) {\n                this.drawings.pop();\n                this.activeDrawing = null;\n                this.state = 'idle';\n            }\n            this.activeTool = null;\n            this.setSelected(null);\n            return true;\n        }\n        if ((key === 'Delete' || key === 'Backspace') && this.selectedDrawing && !this.editingText) {\n            this.deleteSelected();\n            return true;\n        }\n        if (key === 'z' && this.history.length > 0) {\n            this.undo();\n            return true;\n        }\n        return false;\n    }\n\n    deleteSelected(): void {\n        if (!this.selectedDrawing) return;\n        this.snapshot();\n        this.drawings = this.drawings.filter(d => d !== this.selectedDrawing);\n        this.setSelected(null);\n        this.notifyChange();\n    }\n\n    undo(): void {\n        const prev = this.history.pop();\n        if (prev !== undefined) {\n            this.redoStack.push(this.cloneDrawings(this.drawings));\n            this.drawings = prev;\n            this.setSelected(null);\n            this.notifyChange();\n        }\n    }\n\n    redo(): void {\n        const next = this.redoStack.pop();\n        if (next !== undefined) {\n            this.history.push(this.cloneDrawings(this.drawings));\n            this.drawings = next;\n            this.setSelected(null);\n            this.notifyChange();\n        }\n    }\n\n    hideAll(): void {\n        if (this.drawings.length === 0) return;\n        this.snapshot();\n        for (const d of this.drawings) d.visible = false;\n        this.setSelected(null);\n        this.notifyChange();\n    }\n\n    showAll(): void {\n        if (this.drawings.length === 0) return;\n        this.snapshot();\n        for (const d of this.drawings) d.visible = true;\n        this.notifyChange();\n    }\n\n    lockAll(): void {\n        if (this.drawings.length === 0) return;\n        this.snapshot();\n        for (const d of this.drawings) d.locked = true;\n        this.setSelected(null);\n        this.notifyChange();\n    }\n\n    unlockAll(): void {\n        if (this.drawings.length === 0) return;\n        this.snapshot();\n        for (const d of this.drawings) d.locked = false;\n        this.notifyChange();\n    }\n\n    // ── Rendering ─────────────────────────────────────────────────────────────\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        scale: ScaleManager,\n        viewport: Viewport,\n        priceRange: PriceRangeData,\n        chartW: number,\n        chartH: number,\n        pricePrecision = 2,\n        theme?: ChartTheme,\n    ): void {\n        ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\n        if (this.drawings.length === 0) return;\n\n        const dpr = window.devicePixelRatio || 1;\n        ctx.save();\n        ctx.scale(dpr, dpr);\n\n        for (const drawing of this.drawings) {\n            if (drawing.visible === false) continue;\n            drawing.render(ctx, scale, viewport, priceRange, chartW, chartH, drawing === this.selectedDrawing, pricePrecision, theme);\n        }\n\n        ctx.restore();\n    }\n\n    getDrawings(): IDrawing[] {\n        return [...this.drawings];\n    }\n\n    /** Returns a JSON-serializable snapshot of all drawings (data fields only, no methods). */\n    getDrawingsSnapshot(): SerializedDrawing[] {\n        return this.drawings.map(d => ({\n            id: d.id,\n            type: d.type,\n            points: d.points.map(p => ({ ...p })),\n            complete: d.complete,\n            ...(d.visible !== undefined && { visible: d.visible }),\n            ...(d.locked !== undefined && { locked: d.locked }),\n            ...(d.text !== undefined && { text: d.text }),\n            ...(d.style !== undefined && { style: { ...d.style } }),\n        }));\n    }\n\n    /** Restores drawings from a serialized snapshot, replacing current drawings. */\n    loadDrawings(drawings: SerializedDrawing[]): void {\n        this.drawings = drawings.map(sd => {\n            const drawing = this.createDrawing(sd.type, sd.points[0] ?? { barIndex: 0, price: 0 });\n            drawing.id = sd.id;\n            drawing.points = sd.points.map(p => ({ ...p }));\n            drawing.complete = sd.complete;\n            if (sd.visible !== undefined) drawing.visible = sd.visible;\n            if (sd.locked !== undefined) drawing.locked = sd.locked;\n            if (sd.text !== undefined) drawing.text = sd.text;\n            if (sd.style !== undefined) drawing.style = { ...sd.style };\n            return drawing;\n        });\n        this.setSelected(null);\n        this.activeDrawing = null;\n        this.history = [this.drawings.map(d => ({ ...d, points: d.points.map(p => ({ ...p })) }) as IDrawing)];\n        this.redoStack = [];\n    }\n\n    // ── Private helpers ───────────────────────────────────────────────────────\n\n    clearAll(): void {\n        if (this.drawings.length === 0) return;\n        this.snapshot();\n        this.drawings = [];\n        this.setSelected(null);\n        this.activeDrawing = null;\n        this.notifyChange();\n    }\n\n    private notifyChange(): void {\n        this.onDrawingsChange?.();\n    }\n\n    private snapshot(): void {\n        this.history.push(this.cloneDrawings(this.drawings));\n        if (this.history.length > 50) this.history.shift();\n        this.redoStack = [];\n    }\n\n    private cloneDrawings(drawings: IDrawing[]): IDrawing[] {\n        return drawings.map(d => {\n            const clone = Object.create(Object.getPrototypeOf(d)) as IDrawing;\n            Object.assign(clone, d);\n            clone.points = d.points.map((p: DrawingPoint) => ({ ...p }));\n            return clone;\n        });\n    }\n\n    private createDrawing(tool: DrawingToolType, point: DrawingPoint): IDrawing {\n        switch (tool) {\n            // Lines & Channels\n            case 'horizontalLine':   return new HorizontalLine(point);\n            case 'verticalLine':     return new VerticalLine(point);\n            case 'trendLine':        return new TrendLine(point);\n            case 'trendAngle':       return new TrendAngle(point);\n            case 'crossLine':        return new CrossLine(point);\n            case 'parallelChannel':  return new ParallelChannel(point);\n            case 'flatChannel':      return new FlatChannel(point);\n            case 'disjointChannel':  return new DisjointChannel(point);\n            // Fibonacci & Gann\n            case 'fibRetracement':   return new FibRetracement(point);\n            case 'fibExtension':     return new FibExtension(point);\n            case 'fibChannel':       return new FibChannel(point);\n            case 'fibTimezone':      return new FibTimezone(point);\n            case 'fibCircles':       return new FibCircles(point);\n            case 'fibSpiral':        return new FibSpiral(point);\n            case 'fibFan':           return new FibFan(point);\n            case 'fibProjection':    return new FibProjection(point);\n            case 'gannFan':          return new GannFan(point);\n            case 'gannSquare':       return new GannSquare(point);\n            case 'gannBox':          return new GannBox(point);\n            // Geometric Shapes\n            case 'rectangle':        return new Rectangle(point);\n            case 'rotatedRectangle': return new RotatedRectangle(point);\n            case 'ellipse':          return new Ellipse(point);\n            case 'triangle':         return new Triangle(point);\n            case 'circle':           return new Circle(point);\n            case 'arc':              return new Arc(point);\n            case 'polyline':         return new Polyline(point);\n            case 'path':             return new Path(point);\n            // Measurement\n            case 'priceRange':       return new PriceRange(point);\n            case 'dateRange':        return new DateRange(point);\n            case 'datePriceRange':   return new DatePriceRange(point);\n            case 'ruler':            return new Ruler(point);\n            // Pitchfork\n            case 'pitchfork':        return new Pitchfork(point);\n            case 'schiffPitchfork':  return new SchiffPitchfork(point);\n            case 'modifiedSchiff':   return new ModifiedSchiff(point);\n            case 'insidePitchfork':  return new InsidePitchfork(point);\n            // Volume & Statistical\n            case 'fixedRangeVP':     return new FixedRangeVP(point);\n            case 'anchoredVP':       return new AnchoredVP(point);\n            case 'volumeProfile':    return new VolumeProfile(point);\n            case 'regressionTrend':  return new RegressionTrend(point);\n            // Annotations\n            case 'text':             return new Text(point);\n            case 'callout':          return new Callout(point);\n            case 'priceLabel':       return new PriceLabel(point);\n            case 'arrowMarker':      return new ArrowMarker(point);\n            case 'flag':             return new Flag(point);\n            case 'priceNote':        return new PriceNote(point);\n            case 'anchoredNote':     return new AnchoredNote(point);\n            case 'arrowUp':          return new ArrowUp(point);\n            case 'arrowDown':        return new ArrowDown(point);\n            // Pattern Recognition\n            case 'headShoulders':    return new HeadShoulders(point);\n            case 'trianglePattern':  return new TrianglePattern(point);\n            case 'threeDrives':      return new ThreeDrives(point);\n            case 'abcdPattern':      return new AbcdPattern(point);\n            case 'cypherPattern':    return new CypherPattern(point);\n            case 'butterflyPattern': return new ButterflyPattern(point);\n            case 'batPattern':       return new BatPattern(point);\n            case 'gartleyPattern':   return new GartleyPattern(point);\n            case 'crabPattern':      return new CrabPattern(point);\n            case 'sharkPattern':     return new SharkPattern(point);\n            // Elliott Wave\n            case 'elliottImpulse':     return new ElliottImpulse(point);\n            case 'elliottCorrective':  return new ElliottCorrective(point);\n            case 'elliottTriangle':    return new ElliottTriangle(point);\n            case 'elliottCombination': return new ElliottCombination(point);\n            case 'elliottWxy':         return new ElliottWxy(point);\n            // Brush & Highlighter\n            case 'brush':            return new Brush(point);\n            case 'highlighter':      return new Highlighter(point);\n            // Advanced\n            case 'sineLine':         return new SineLine(point);\n            case 'cyclicLines':      return new CyclicLines(point);\n            case 'timeCycles':       return new TimeCycles(point);\n            case 'projection':       return new Projection(point);\n            case 'priceProjection':  return new PriceProjection(point);\n            case 'ghostFeed':        return new GhostFeed(point);\n            default:                 return new TrendLine(point);\n        }\n    }\n}\n","import type { ChartTheme } from '../core/themes.js';\nimport { DEFAULT_INDICATOR_OVERLAY_CONFIG, type IndicatorOverlayUiConfig } from '../core/uiConfig.js';\nimport { DEFAULT_LABELS, type ChartMiscLabels } from '../core/labels.js';\nimport { ICON_GEAR, ICON_CLOSE, ICON_BULLET, ICON_EYE, ICON_EYE_OFF } from './icons.js';\n\nconst MAX_INLINE = 2;\n\ninterface PillEntry {\n    color: string;\n    label: string;\n    timeframe: string;\n    visible: boolean;\n    onRemove: () => void;\n    onEdit: (() => void) | null;\n    onToggleVisibility: () => void;\n}\n\nexport class IndicatorOverlay {\n    readonly el: HTMLDivElement;\n    private theme:  ChartTheme;\n    private cfg:    IndicatorOverlayUiConfig;\n    private labels: ChartMiscLabels;\n    private pills = new Map<string, PillEntry>();\n\n    private inlineRow:    HTMLDivElement;\n    private collapseBtn:  HTMLButtonElement;\n    private dropdownPanel: HTMLDivElement;\n    private isOpen = false;\n\n    constructor(\n        theme:  ChartTheme,\n        cfg:    IndicatorOverlayUiConfig = DEFAULT_INDICATOR_OVERLAY_CONFIG,\n        labels: ChartMiscLabels         = DEFAULT_LABELS.chart,\n    ) {\n        this.theme  = theme;\n        this.cfg    = cfg;\n        this.labels = labels;\n\n        this.el = document.createElement('div');\n        Object.assign(this.el.style, {\n            position:      'absolute',\n            top:           '52px',\n            left:          '6px',\n            zIndex:        '10',\n            display:       'none',\n            alignItems:    'center',\n            gap:           '10px',\n            pointerEvents: 'auto',\n        });\n\n        this.inlineRow = document.createElement('div');\n        Object.assign(this.inlineRow.style, {\n            display:    'flex',\n            alignItems: 'center',\n            gap:        '10px',\n        });\n\n        this.collapseBtn = document.createElement('button');\n        Object.assign(this.collapseBtn.style, {\n            display:      'none',\n            alignItems:   'center',\n            gap:          '4px',\n            background:   this.theme.indicatorOverlay.pillBg,\n            color:        this.theme.axisText,\n            border:       `1px solid ${this.theme.axisBorder}`,\n            borderRadius: '4px',\n            padding:      '2px 8px',\n            fontSize:     this.cfg.collapseBtnFontSize,\n            fontFamily:   this.cfg.collapseBtnFontFamily,\n            cursor:       'pointer',\n            outline:      'none',\n        });\n        this.collapseBtn.addEventListener('click', (e) => {\n            e.stopPropagation();\n            this.toggleDropdown();\n        });\n\n        this.dropdownPanel = document.createElement('div');\n        Object.assign(this.dropdownPanel.style, {\n            display:      'none',\n            position:     'absolute',\n            top:          '100%',\n            left:         '0',\n            marginTop:    '4px',\n            background:   this.theme.tooltip.background,\n            border:       `1px solid ${this.theme.axisBorder}`,\n            borderRadius: '4px',\n            padding:      '4px 0',\n            minWidth:     '140px',\n            zIndex:       '20',\n            boxShadow:    '0 4px 12px rgba(0,0,0,0.15)',\n        });\n\n        const collapseWrap = document.createElement('div');\n        Object.assign(collapseWrap.style, { position: 'relative' });\n        collapseWrap.append(this.collapseBtn, this.dropdownPanel);\n\n        this.el.append(this.inlineRow, collapseWrap);\n\n        document.addEventListener('click', this.onDocClick);\n    }\n\n    // ── Public API ────────────────────────────────────────────────────────────\n\n    addPill(\n        name: string,\n        color: string,\n        label: string,\n        timeframe: string = 'Chart',\n        visible: boolean = true,\n        onRemove: () => void,\n        onEdit: (() => void) | null = null,\n        onToggleVisibility: () => void,\n    ): void {\n        if (this.pills.has(name)) return;\n        this.pills.set(name, { color, label, timeframe, visible, onRemove, onEdit, onToggleVisibility });\n        this.refresh();\n    }\n\n    updatePillColor(name: string, newColor: string): void {\n        const entry = this.pills.get(name);\n        if (!entry) return;\n        entry.color = newColor;\n        this.refresh();\n    }\n\n    updatePillLabel(name: string, label: string): void {\n        const entry = this.pills.get(name);\n        if (!entry) return;\n        entry.label = label;\n        this.refresh();\n    }\n\n    updatePillTimeframe(name: string, timeframe: string): void {\n        const entry = this.pills.get(name);\n        if (!entry) return;\n        entry.timeframe = timeframe;\n        this.refresh();\n    }\n\n    updatePillVisibility(name: string, visible: boolean): void {\n        const entry = this.pills.get(name);\n        if (!entry) return;\n        entry.visible = visible;\n        this.refresh();\n    }\n\n    removePill(name: string): void {\n        if (!this.pills.has(name)) return;\n        this.pills.delete(name);\n        this.refresh();\n    }\n\n    setTheme(theme: ChartTheme): void {\n        this.theme = theme;\n        Object.assign(this.collapseBtn.style, {\n            background: theme.indicatorOverlay.pillBg,\n            color:      theme.axisText,\n            border:     `1px solid ${theme.axisBorder}`,\n        });\n        Object.assign(this.dropdownPanel.style, {\n            background: theme.tooltip.background,\n            border:     `1px solid ${theme.axisBorder}`,\n        });\n        this.refresh();\n    }\n\n    destroy(): void {\n        document.removeEventListener('click', this.onDocClick);\n    }\n\n    // ── Private helpers ───────────────────────────────────────────────────────\n\n    private refresh(): void {\n        const entries = Array.from(this.pills.entries());\n        this.inlineRow.innerHTML = '';\n        this.dropdownPanel.innerHTML = '';\n\n        if (entries.length === 0) {\n            this.el.style.display = 'none';\n            this.collapseBtn.style.display = 'none';\n            return;\n        }\n\n        this.el.style.display = 'flex';\n\n        if (entries.length <= MAX_INLINE) {\n            this.isOpen = false;\n            this.dropdownPanel.style.display = 'none';\n            this.collapseBtn.style.display = 'none';\n            for (const [name, entry] of entries) {\n                this.inlineRow.appendChild(this.makePill(name, entry));\n            }\n        } else {\n            this.collapseBtn.style.display = 'inline-flex';\n            this.collapseBtn.textContent = this.labels.nIndicators.replace('{count}', String(entries.length));\n            for (const [name, entry] of entries) {\n                this.dropdownPanel.appendChild(this.makeDropdownRow(name, entry));\n            }\n            this.dropdownPanel.style.display = this.isOpen ? 'block' : 'none';\n        }\n    }\n\n    private makeTimeframeBadge(timeframe: string): HTMLSpanElement | null {\n        if (!timeframe || timeframe === 'Chart') return null;\n        const badge = document.createElement('span');\n        badge.textContent = timeframe;\n        Object.assign(badge.style, {\n            fontSize:     '10px',\n            padding:      '1px 4px',\n            borderRadius: '3px',\n            background:   'rgba(128,128,128,0.18)',\n            color:        this.theme.axisText,\n            marginLeft:   '2px',\n            lineHeight:   '1.4',\n        });\n        return badge;\n    }\n\n    private makeEyeIcon(entry: PillEntry): HTMLSpanElement {\n        const eye = document.createElement('span');\n        eye.innerHTML = entry.visible ? ICON_EYE : ICON_EYE_OFF;\n        Object.assign(eye.style, {\n            display:    'inline-flex',\n            alignItems: 'center',\n            color:      this.theme.indicatorOverlay.iconColor,\n            cursor:     'pointer',\n            opacity:    entry.visible ? '0.6' : '0.4',\n            lineHeight: '1',\n        });\n        eye.addEventListener('mouseenter', () => { eye.style.opacity = '1'; });\n        eye.addEventListener('mouseleave', () => { eye.style.opacity = entry.visible ? '0.6' : '0.4'; });\n        eye.addEventListener('click', (e) => { e.stopPropagation(); entry.onToggleVisibility(); });\n        return eye;\n    }\n\n    private makePill(_name: string, entry: PillEntry): HTMLSpanElement {\n        const pill = document.createElement('span');\n        Object.assign(pill.style, {\n            display:      'inline-flex',\n            alignItems:   'center',\n            gap:          '4px',\n            fontSize:     this.cfg.pillFontSize,\n            fontFamily:   this.cfg.pillFontFamily,\n            color:        entry.color,\n            whiteSpace:   'nowrap',\n            userSelect:   'none',\n            background:   this.theme.indicatorOverlay.pillBg,\n            borderRadius: '4px',\n            padding:      '1px 6px 1px 5px',\n            opacity:      entry.visible ? '1' : '0.4',\n        });\n\n        const dot = document.createElement('span');\n        dot.innerHTML = ICON_BULLET;\n        Object.assign(dot.style, { display: 'inline-flex', alignItems: 'center' });\n\n        const txt = document.createElement('span');\n        txt.textContent = entry.label;\n\n        const badge = this.makeTimeframeBadge(entry.timeframe);\n\n        const actions = document.createElement('span');\n        Object.assign(actions.style, {\n            display:    'inline-flex',\n            alignItems: 'center',\n            gap:        '8px',\n            marginLeft: '12px',\n        });\n\n        actions.appendChild(this.makeEyeIcon(entry));\n\n        if (entry.onEdit) {\n            const gear = document.createElement('span');\n            gear.innerHTML = ICON_GEAR;\n            Object.assign(gear.style, {\n                display:    'inline-flex',\n                alignItems: 'center',\n                color:      this.theme.indicatorOverlay.iconColor,\n                cursor:     'pointer',\n                opacity:    '0.6',\n                lineHeight: '1',\n            });\n            gear.addEventListener('mouseenter', () => { gear.style.opacity = '1'; });\n            gear.addEventListener('mouseleave', () => { gear.style.opacity = '0.6'; });\n            gear.addEventListener('click', (e) => { e.stopPropagation(); entry.onEdit!(); });\n            actions.appendChild(gear);\n        }\n\n        const x = document.createElement('span');\n        x.innerHTML = ICON_CLOSE;\n        Object.assign(x.style, {\n            display:    'inline-flex',\n            alignItems: 'center',\n            color:      this.theme.indicatorOverlay.iconColor,\n            cursor:     'pointer',\n        });\n        x.addEventListener('click', (e) => { e.stopPropagation(); entry.onRemove(); });\n        actions.appendChild(x);\n\n        pill.append(dot, txt);\n        if (badge) pill.appendChild(badge);\n        pill.appendChild(actions);\n        return pill;\n    }\n\n    private makeDropdownRow(_name: string, entry: PillEntry): HTMLDivElement {\n        const row = document.createElement('div');\n        Object.assign(row.style, {\n            display:        'flex',\n            alignItems:     'center',\n            justifyContent: 'space-between',\n            gap:            '8px',\n            padding:        '4px 10px',\n            fontSize:       this.cfg.dropdownRowFontSize,\n            fontFamily:     this.cfg.dropdownRowFontFamily,\n            color:          entry.color,\n            cursor:         'default',\n            opacity:        entry.visible ? '1' : '0.4',\n        });\n        row.addEventListener('mouseenter', () => { row.style.background = this.theme.indicatorOverlay.dropdownHoverBg; });\n        row.addEventListener('mouseleave', () => { row.style.background = 'transparent'; });\n\n        const dot = document.createElement('span');\n        dot.innerHTML = ICON_BULLET;\n        Object.assign(dot.style, { display: 'inline-flex', alignItems: 'center' });\n\n        const nameWrap = document.createElement('span');\n        Object.assign(nameWrap.style, { display: 'inline-flex', alignItems: 'center', gap: '4px', flex: '1' });\n\n        const txt = document.createElement('span');\n        txt.textContent = entry.label;\n        nameWrap.appendChild(txt);\n\n        const badge = this.makeTimeframeBadge(entry.timeframe);\n        if (badge) nameWrap.appendChild(badge);\n\n        const actions = document.createElement('span');\n        Object.assign(actions.style, { display: 'inline-flex', alignItems: 'center', gap: '4px' });\n\n        const eye = document.createElement('span');\n        eye.innerHTML = entry.visible ? ICON_EYE : ICON_EYE_OFF;\n        Object.assign(eye.style, {\n            display:    'inline-flex',\n            alignItems: 'center',\n            color:      this.theme.indicatorOverlay.iconColor,\n            cursor:     'pointer',\n            opacity:    entry.visible ? '0.6' : '0.4',\n            lineHeight: '1',\n        });\n        eye.addEventListener('mouseenter', () => { eye.style.opacity = '1'; });\n        eye.addEventListener('mouseleave', () => { eye.style.opacity = entry.visible ? '0.6' : '0.4'; });\n        eye.addEventListener('click', (e) => {\n            e.stopPropagation();\n            entry.onToggleVisibility();\n        });\n        actions.appendChild(eye);\n\n        if (entry.onEdit) {\n            const gear = document.createElement('span');\n            gear.innerHTML = ICON_GEAR;\n            Object.assign(gear.style, {\n                display:    'inline-flex',\n                alignItems: 'center',\n                color:      this.theme.indicatorOverlay.iconColor,\n                cursor:     'pointer',\n                opacity:    '0.6',\n                lineHeight: '1',\n            });\n            gear.addEventListener('mouseenter', () => { gear.style.opacity = '1'; });\n            gear.addEventListener('mouseleave', () => { gear.style.opacity = '0.6'; });\n            gear.addEventListener('click', (e) => {\n                e.stopPropagation();\n                this.isOpen = false;\n                this.dropdownPanel.style.display = 'none';\n                entry.onEdit!();\n            });\n            actions.appendChild(gear);\n        }\n\n        const x = document.createElement('span');\n        x.innerHTML = ICON_CLOSE;\n        Object.assign(x.style, {\n            display:    'inline-flex',\n            alignItems: 'center',\n            color:      this.theme.indicatorOverlay.iconColor,\n            cursor:     'pointer',\n        });\n        x.addEventListener('click', (e) => {\n            e.stopPropagation();\n            entry.onRemove();\n        });\n        actions.appendChild(x);\n\n        row.append(dot, nameWrap, actions);\n        return row;\n    }\n\n    private toggleDropdown(): void {\n        this.isOpen = !this.isOpen;\n        this.dropdownPanel.style.display = this.isOpen ? 'block' : 'none';\n        this.collapseBtn.textContent = this.labels.nIndicators.replace('{count}', String(this.pills.size));\n    }\n\n    private onDocClick = (e: MouseEvent): void => {\n        if (this.isOpen && !this.el.contains(e.target as Node)) {\n            this.isOpen = false;\n            this.dropdownPanel.style.display = 'none';\n            this.collapseBtn.textContent = this.labels.nIndicators.replace('{count}', String(this.pills.size));\n        }\n    };\n}\n","import type { ChartTheme } from '../core/themes.js';\nimport type { IndicatorParamSchema, ParamFieldDef } from '../core/indicatorSettings.js';\nimport type { IndicatorParams } from '../core/types.js';\nimport { DEFAULT_LABELS, type DialogLabels } from '../core/labels.js';\nimport { ICON_CLOSE } from './icons.js';\nimport { observeKeyboardTransform } from './keyboardAware.js';\n\nexport class IndicatorSettingsDialog {\n    /** Backdrop element — append this to document.body */\n    readonly el: HTMLDivElement;\n\n    private theme:  ChartTheme;\n    private labels: DialogLabels;\n    private panel: HTMLDivElement;\n    private schema: IndicatorParamSchema | null = null;\n    private currentParams: IndicatorParams = {};\n    private onUpdate: ((params: IndicatorParams) => void) | null = null;\n    private onRemove: (() => void) | null = null;\n    private inputRefs = new Map<string, HTMLInputElement | HTMLSelectElement>();\n    private disposeKbd: () => void = () => {};\n    private onVisibilityChange?: () => void;\n\n    constructor(\n        theme: ChartTheme,\n        labels: DialogLabels = DEFAULT_LABELS.dialogs,\n        onVisibilityChange?: () => void,\n    ) {\n        this.theme  = theme;\n        this.labels = labels;\n        this.onVisibilityChange = onVisibilityChange;\n\n        // Backdrop\n        this.el = document.createElement('div');\n        Object.assign(this.el.style, {\n            position:       'fixed',\n            inset:          '0',\n            background:     'rgba(0,0,0,0.5)',\n            display:        'none',\n            alignItems:     'center',\n            justifyContent: 'center',\n            zIndex:         '1000',\n        });\n        this.el.addEventListener('mousedown', (e) => {\n            if (e.target === this.el) this.hide();\n        });\n\n        // Modal panel\n        this.panel = document.createElement('div');\n        Object.assign(this.panel.style, {\n            display:       'flex',\n            flexDirection: 'column',\n            minWidth:      '300px',\n            maxWidth:      '360px',\n            background:    this.theme.tooltip.background,\n            border:        `1px solid ${this.theme.axisBorder}`,\n            borderRadius:  '6px',\n            boxShadow:     '0 8px 32px rgba(0,0,0,0.45)',\n            fontFamily: \"'Inter', system-ui, sans-serif\",\n            fontSize:      '12px',\n            overflow:      'hidden',\n        });\n        // Prevent backdrop click from firing when clicking inside panel\n        this.panel.addEventListener('mousedown', (e) => e.stopPropagation());\n\n        this.el.appendChild(this.panel);\n\n        this.disposeKbd = observeKeyboardTransform(this.panel);\n    }\n\n    // ── Public API ────────────────────────────────────────────────────────────\n\n    show(\n        schema: IndicatorParamSchema,\n        currentParams: IndicatorParams,\n        onUpdate: (params: IndicatorParams) => void,\n        onRemove: () => void,\n    ): void {\n        const wasVisible = this.isVisible;\n        this.schema = schema;\n        this.currentParams = { ...currentParams };\n        this.onUpdate = onUpdate;\n        this.onRemove = onRemove;\n        this.rebuild();\n        this.el.style.display = 'flex';\n        if (!wasVisible) this.onVisibilityChange?.();\n    }\n\n    hide(): void {\n        const wasVisible = this.isVisible;\n        this.el.style.display = 'none';\n        this.schema = null;\n        this.onUpdate = null;\n        this.onRemove = null;\n        if (wasVisible) this.onVisibilityChange?.();\n    }\n\n    get isVisible(): boolean {\n        return this.el.style.display !== 'none';\n    }\n\n    setTheme(theme: ChartTheme): void {\n        this.theme = theme;\n        Object.assign(this.panel.style, {\n            background: theme.tooltip.background,\n            border:     `1px solid ${theme.axisBorder}`,\n        });\n        // Rebuild DOM with new theme if currently visible\n        if (this.el.style.display !== 'none' && this.schema) {\n            this.rebuild();\n        }\n    }\n\n    destroy(): void {\n        this.disposeKbd();\n        this.el.remove();\n    }\n\n    // ── Private helpers ───────────────────────────────────────────────────────\n\n    private rebuild(): void {\n        this.panel.innerHTML = '';\n        this.inputRefs.clear();\n        if (!this.schema) return;\n\n        this.panel.appendChild(this.buildHeader(this.schema.shortName));\n        this.panel.appendChild(this.buildBody(this.schema.fields));\n        this.panel.appendChild(this.buildFooter());\n    }\n\n    private buildHeader(title: string): HTMLDivElement {\n        const header = document.createElement('div');\n        Object.assign(header.style, {\n            display:        'flex',\n            alignItems:     'center',\n            justifyContent: 'space-between',\n            padding:        '10px 14px',\n            borderBottom:   `1px solid ${this.theme.axisBorder}`,\n        });\n\n        const titleEl = document.createElement('span');\n        titleEl.textContent = `${title} ${this.labels.indicator.titleSuffix}`;\n        Object.assign(titleEl.style, {\n            color:      this.theme.tooltip.text,\n            fontWeight: '600',\n            fontSize:   '13px',\n        });\n\n        const closeBtn = document.createElement('span');\n        closeBtn.innerHTML = ICON_CLOSE;\n        Object.assign(closeBtn.style, {\n            display:    'inline-flex',\n            alignItems: 'center',\n            color:      this.theme.axisText,\n            cursor:     'pointer',\n        });\n        closeBtn.addEventListener('mouseenter', () => { closeBtn.style.color = this.theme.tooltip.text; });\n        closeBtn.addEventListener('mouseleave', () => { closeBtn.style.color = this.theme.axisText; });\n        closeBtn.addEventListener('click', () => this.hide());\n\n        header.append(titleEl, closeBtn);\n        return header;\n    }\n\n    private buildBody(fields: ParamFieldDef[]): HTMLDivElement {\n        const body = document.createElement('div');\n        Object.assign(body.style, {\n            padding: '12px 14px',\n            display: 'flex',\n            flexDirection: 'column',\n            gap: '8px',\n        });\n\n        if (fields.length === 0) {\n            const empty = document.createElement('span');\n            empty.textContent = this.labels.indicator.noParams;\n            Object.assign(empty.style, { color: this.theme.axisText, fontSize: '11px' });\n            body.appendChild(empty);\n            return body;\n        }\n\n        for (const field of fields) {\n            body.appendChild(this.buildField(field));\n        }\n        return body;\n    }\n\n    private buildField(field: ParamFieldDef): HTMLDivElement {\n        const row = document.createElement('div');\n        Object.assign(row.style, {\n            display:        'flex',\n            alignItems:     'center',\n            justifyContent: 'space-between',\n            gap:            '10px',\n        });\n\n        const label = document.createElement('label');\n        label.textContent = field.label;\n        Object.assign(label.style, {\n            color:    this.theme.axisText,\n            fontSize: '12px',\n            flex:     '1',\n        });\n\n        const currentVal = this.currentParams[field.key] ?? field.default;\n\n        if (field.kind === 'number') {\n            const input = document.createElement('input');\n            input.type  = 'number';\n            input.min   = String(field.min);\n            input.max   = String(field.max);\n            input.step  = String(field.step);\n            input.value = String(currentVal);\n            Object.assign(input.style, {\n                width:        '80px',\n                background:   this.theme.background,\n                color:        this.theme.tooltip.text,\n                border:       `1px solid ${this.theme.axisBorder}`,\n                borderRadius: '3px',\n                padding:      '4px 6px',\n                // iOS Safari auto-zooms on focus for inputs <16px without\n                // restoring the zoom — keep at 16px to disable that.\n                fontSize:     '16px',\n                fontFamily:   \"'Inter', system-ui, sans-serif\",\n                outline:      'none',\n                textAlign:    'right',\n            });\n            this.inputRefs.set(field.key, input);\n            row.append(label, input);\n        } else if (field.kind === 'select') {\n            const select = document.createElement('select');\n            for (const opt of field.options) {\n                const option = document.createElement('option');\n                option.value = opt;\n                option.textContent = opt;\n                if (opt === String(currentVal)) option.selected = true;\n                select.appendChild(option);\n            }\n            Object.assign(select.style, {\n                minWidth:     '120px',\n                background:   this.theme.background,\n                color:        this.theme.tooltip.text,\n                border:       `1px solid ${this.theme.axisBorder}`,\n                borderRadius: '3px',\n                padding:      '4px 6px',\n                fontSize:     '12px',\n                fontFamily:   \"'Inter', system-ui, sans-serif\",\n                outline:      'none',\n                cursor:       'pointer',\n            });\n            this.inputRefs.set(field.key, select);\n            row.append(label, select);\n        } else {\n            const input = document.createElement('input');\n            input.type  = 'color';\n            input.value = String(currentVal);\n            Object.assign(input.style, {\n                width:        '40px',\n                height:       '26px',\n                border:       'none',\n                padding:      '0',\n                cursor:       'pointer',\n                background:   'transparent',\n                borderRadius: '3px',\n            });\n            this.inputRefs.set(field.key, input);\n            row.append(label, input);\n        }\n\n        return row;\n    }\n\n    private buildFooter(): HTMLDivElement {\n        const footer = document.createElement('div');\n        Object.assign(footer.style, {\n            display:     'flex',\n            gap:         '8px',\n            padding:     '10px 14px',\n            borderTop:   `1px solid ${this.theme.axisBorder}`,\n        });\n\n        const removeBtn = this.makeButton('Remove', '#ef5350', 'transparent', '#ef5350');\n        removeBtn.addEventListener('click', () => {\n            this.onRemove?.();\n            this.hide();\n        });\n\n        const updateBtn = this.makeButton('Update', '#fff', '#2196f3', '#2196f3');\n        updateBtn.addEventListener('click', () => {\n            if (!this.schema || !this.onUpdate) return;\n            const params: IndicatorParams = {};\n            for (const field of this.schema.fields) {\n                const inp = this.inputRefs.get(field.key);\n                if (!inp) continue;\n                params[field.key] = field.kind === 'number' ? Number(inp.value) : String(inp.value);\n            }\n            this.onUpdate(params);\n            this.hide();\n        });\n\n        footer.append(removeBtn, updateBtn);\n        return footer;\n    }\n\n    private makeButton(\n        text: string,\n        color: string,\n        background: string,\n        borderColor: string,\n    ): HTMLButtonElement {\n        const btn = document.createElement('button');\n        btn.textContent = text;\n        Object.assign(btn.style, {\n            flex:         '1',\n            color,\n            background,\n            border:       `1px solid ${borderColor}`,\n            borderRadius: '4px',\n            padding:      '6px 0',\n            cursor:       'pointer',\n            fontSize:     '12px',\n            fontFamily: \"'Inter', system-ui, sans-serif\",\n            fontWeight:   '600',\n            outline:      'none',\n        });\n        btn.addEventListener('mouseenter', () => { btn.style.opacity = '0.85'; });\n        btn.addEventListener('mouseleave', () => { btn.style.opacity = '1'; });\n        return btn;\n    }\n}\n","import type { ChartTheme } from '../core/themes.js';\nimport type { TradeDisplayFilter, PositionRenderStyle, CanvasColorSettings } from '../core/types.js';\nimport { DEFAULT_LABELS, type DialogLabels } from '../core/labels.js';\nimport { ICON_TAB, ICON_CLOSE_SM } from './icons.js';\n\nexport type { CanvasColorSettings };\n\nexport interface ChartSettings {\n    tradeDisplayFilter: TradeDisplayFilter;\n    positionRenderStyle: PositionRenderStyle;\n    theme: 'dark' | 'light';\n    /** Always render SL/TP bracket lines + price pills, even without hover. */\n    showTradeLevelsAlways: boolean;\n    /** Show candle countdown timer on the right price axis under the live price tag. */\n    showPriceAxisCountdown: boolean;\n    canvasColors?: {\n        dark?: Partial<CanvasColorSettings>;\n        light?: Partial<CanvasColorSettings>;\n    };\n}\n\ntype SettingsTab = 'appearance' | 'trading';\n\nconst TAB_LABELS: Record<SettingsTab, string> = {\n    appearance: 'Appearance',\n    trading: 'Trading',\n};\n\nexport class ChartSettingsDialog {\n    readonly el: HTMLDivElement;\n    private panel: HTMLDivElement;\n    private sidebar: HTMLDivElement;\n    private content: HTMLDivElement;\n\n    private theme: ChartTheme;\n    private labels: DialogLabels;\n    private current: ChartSettings;\n    private activeTab: SettingsTab = 'appearance';\n    private onChange: ((s: ChartSettings) => void) | null = null;\n    private onReset: (() => void) | null = null;\n\n    private tabEls = new Map<SettingsTab, HTMLButtonElement>();\n    private showTradingTab: boolean;\n    private enableThemeToggle: boolean;\n    private onVisibilityChange?: () => void;\n\n    constructor(\n        theme: ChartTheme,\n        initial: ChartSettings,\n        labels: DialogLabels = DEFAULT_LABELS.dialogs,\n        showTradingTab = true,\n        enableThemeToggle = false,\n        onVisibilityChange?: () => void,\n    ) {\n        this.theme = theme;\n        this.labels = labels;\n        this.current = { ...initial };\n        this.showTradingTab = showTradingTab;\n        this.enableThemeToggle = enableThemeToggle;\n        this.onVisibilityChange = onVisibilityChange;\n        if (!showTradingTab && this.activeTab === 'trading') this.activeTab = 'appearance';\n\n        // ── Backdrop ──────────────────────────────────────────────────────────\n        this.el = document.createElement('div');\n        Object.assign(this.el.style, {\n            position: 'fixed',\n            inset: '0',\n            background: 'rgba(0,0,0,0.5)',\n            display: 'none',\n            alignItems: 'center',\n            justifyContent: 'center',\n            zIndex: '10000',\n        });\n        this.el.addEventListener('mousedown', (e) => {\n            if (e.target === this.el) this.hide();\n        });\n\n        // ── Panel ─────────────────────────────────────────────────────────────\n        this.panel = document.createElement('div');\n        Object.assign(this.panel.style, {\n            display: 'flex',\n            flexDirection: 'column',\n            width: '540px',\n            minHeight: '340px',\n            maxWidth: 'calc(100vw - 32px)',\n            maxHeight: 'calc(100vh - 48px)',\n            background: theme.tooltip.background,\n            border: `1px solid ${theme.axisBorder}`,\n            borderRadius: '10px',\n            boxShadow: '0 16px 48px rgba(0,0,0,0.55), 0 4px 16px rgba(0,0,0,0.3)',\n            fontFamily: \"'Inter', system-ui, -apple-system, sans-serif\",\n            fontSize: '12px',\n            overflow: 'hidden',\n        });\n        this.panel.addEventListener('mousedown', (e) => e.stopPropagation());\n\n        // ── Header ────────────────────────────────────────────────────────────\n        const header = this.buildHeader();\n        this.panel.appendChild(header);\n\n        // ── Body: sidebar + content ────────────────────────────────────────────\n        const body = document.createElement('div');\n        Object.assign(body.style, {\n            display: 'flex',\n            flex: '1',\n            overflow: 'hidden',\n        });\n\n        this.sidebar = this.buildSidebar();\n        body.appendChild(this.sidebar);\n\n        this.content = document.createElement('div');\n        Object.assign(this.content.style, {\n            flex: '1',\n            padding: '20px 24px',\n            overflowY: 'auto',\n            scrollbarWidth: 'thin',\n        });\n        body.appendChild(this.content);\n\n        this.panel.appendChild(body);\n\n        // ── Footer ────────────────────────────────────────────────────────────\n        this.panel.appendChild(this.buildFooter());\n\n        this.el.appendChild(this.panel);\n    }\n\n    show(current: ChartSettings, onChange: (s: ChartSettings) => void, onReset?: () => void): void {\n        const wasVisible = this.isVisible;\n        this.current = { ...current };\n        this.onChange = onChange;\n        this.onReset = onReset ?? null;\n        this.renderContent();\n        this.el.style.display = 'flex';\n        if (!wasVisible) this.onVisibilityChange?.();\n    }\n\n    hide(): void {\n        const wasVisible = this.isVisible;\n        this.el.style.display = 'none';\n        this.onChange = null;\n        this.onReset = null;\n        if (wasVisible) this.onVisibilityChange?.();\n    }\n\n    get isVisible(): boolean {\n        return this.el.style.display !== 'none';\n    }\n\n    setTheme(theme: ChartTheme): void {\n        this.theme = theme;\n        this.applyPanelTheme();\n        if (this.el.style.display !== 'none') this.renderContent();\n    }\n\n    destroy(): void {\n        this.el.remove();\n    }\n\n    // ── Private – emit ────────────────────────────────────────────────────────\n\n    private emit(): void {\n        this.onChange?.({ ...this.current });\n    }\n\n    // ── Private – panel theme ─────────────────────────────────────────────────\n\n    private applyPanelTheme(): void {\n        Object.assign(this.panel.style, {\n            background: this.theme.tooltip.background,\n            border: `1px solid ${this.theme.axisBorder}`,\n        });\n        // Re-render sidebar tabs with updated theme\n        this.sidebar.innerHTML = '';\n        this.tabEls.clear();\n        this.buildSidebarTabs(this.sidebar);\n        this.highlightActiveTab();\n    }\n\n    // ── Private – header ──────────────────────────────────────────────────────\n\n    private buildHeader(): HTMLDivElement {\n        const header = document.createElement('div');\n        Object.assign(header.style, {\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'space-between',\n            padding: '14px 20px 12px',\n            borderBottom: `1px solid ${this.theme.axisBorder}`,\n            flexShrink: '0',\n        });\n\n        const title = document.createElement('span');\n        title.textContent = this.labels.settings.title;\n        Object.assign(title.style, {\n            color: this.theme.tooltip.text,\n            fontWeight: '600',\n            fontSize: '14px',\n            letterSpacing: '-0.01em',\n        });\n\n        const closeBtn = document.createElement('button');\n        closeBtn.innerHTML = ICON_CLOSE_SM;\n        Object.assign(closeBtn.style, {\n            color: this.theme.axisText,\n            cursor: 'pointer',\n            background: 'transparent',\n            border: 'none',\n            padding: '4px',\n            borderRadius: '4px',\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n            outline: 'none',\n            transition: 'color 0.1s, background 0.1s',\n        });\n        closeBtn.addEventListener('mouseenter', () => {\n            closeBtn.style.color = this.theme.tooltip.text;\n            closeBtn.style.background = this.theme.ui.accentBg;\n        });\n        closeBtn.addEventListener('mouseleave', () => {\n            closeBtn.style.color = this.theme.axisText;\n            closeBtn.style.background = 'transparent';\n        });\n        closeBtn.addEventListener('click', () => this.hide());\n\n        header.append(title, closeBtn);\n        return header;\n    }\n\n    // ── Private – footer ──────────────────────────────────────────────────────\n\n    private buildFooter(): HTMLDivElement {\n        const footer = document.createElement('div');\n        Object.assign(footer.style, {\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'flex-end',\n            padding: '10px 20px',\n            borderTop: `1px solid ${this.theme.axisBorder}`,\n            flexShrink: '0',\n        });\n\n        const resetBtn = document.createElement('button');\n        resetBtn.textContent = this.labels.settings.resetBtn;\n        Object.assign(resetBtn.style, {\n            color: this.theme.axisText,\n            fontSize: '11px',\n            fontFamily: \"'Inter', system-ui, sans-serif\",\n            background: 'transparent',\n            border: `1px solid ${this.theme.axisBorder}`,\n            borderRadius: '5px',\n            padding: '5px 12px',\n            cursor: 'pointer',\n            outline: 'none',\n            transition: 'color 0.1s, border-color 0.1s, background 0.1s',\n        });\n        resetBtn.addEventListener('mouseenter', () => {\n            resetBtn.style.color = this.theme.tooltip.text;\n            resetBtn.style.borderColor = this.theme.ui.accent;\n            resetBtn.style.background = this.theme.ui.accentBg;\n        });\n        resetBtn.addEventListener('mouseleave', () => {\n            resetBtn.style.color = this.theme.axisText;\n            resetBtn.style.borderColor = this.theme.axisBorder;\n            resetBtn.style.background = 'transparent';\n        });\n        resetBtn.addEventListener('click', () => {\n            this.onReset?.();\n            this.hide();\n        });\n\n        footer.appendChild(resetBtn);\n        return footer;\n    }\n\n    // ── Private – sidebar ─────────────────────────────────────────────────────\n\n    private buildSidebar(): HTMLDivElement {\n        const sidebar = document.createElement('div');\n        Object.assign(sidebar.style, {\n            width: '130px',\n            flexShrink: '0',\n            borderRight: `1px solid ${this.theme.axisBorder}`,\n            padding: '10px 0',\n            display: 'flex',\n            flexDirection: 'column',\n            gap: '2px',\n        });\n        this.buildSidebarTabs(sidebar);\n        return sidebar;\n    }\n\n    private buildSidebarTabs(container: HTMLDivElement): void {\n        const tabs: SettingsTab[] = this.showTradingTab ? ['appearance', 'trading'] : ['appearance'];\n        for (const tab of tabs) {\n            const btn = document.createElement('button');\n            Object.assign(btn.style, {\n                display: 'flex',\n                alignItems: 'center',\n                gap: '8px',\n                padding: '8px 14px',\n                background: 'transparent',\n                border: 'none',\n                borderLeft: '2px solid transparent',\n                color: this.theme.axisText,\n                fontSize: '12px',\n                fontFamily: \"'Inter', system-ui, sans-serif\",\n                cursor: 'pointer',\n                width: '100%',\n                textAlign: 'left',\n                outline: 'none',\n                transition: 'background 0.1s, color 0.1s',\n                boxSizing: 'border-box',\n            });\n\n            const iconSpan = document.createElement('span');\n            iconSpan.innerHTML = ICON_TAB[tab];\n            Object.assign(iconSpan.style, { display: 'flex', flexShrink: '0' });\n\n            const labelSpan = document.createElement('span');\n            labelSpan.textContent = TAB_LABELS[tab];\n\n            btn.append(iconSpan, labelSpan);\n\n            btn.addEventListener('mouseenter', () => {\n                if (this.activeTab !== tab) {\n                    btn.style.background = this.theme.ui.accentBg;\n                    btn.style.color = this.theme.tooltip.text;\n                }\n            });\n            btn.addEventListener('mouseleave', () => {\n                if (this.activeTab !== tab) {\n                    btn.style.background = 'transparent';\n                    btn.style.color = this.theme.axisText;\n                }\n            });\n            btn.addEventListener('click', () => {\n                this.activeTab = tab;\n                this.highlightActiveTab();\n                this.renderContent();\n            });\n\n            this.tabEls.set(tab, btn);\n            container.appendChild(btn);\n        }\n    }\n\n    private highlightActiveTab(): void {\n        for (const [tab, btn] of this.tabEls) {\n            const isActive = tab === this.activeTab;\n            Object.assign(btn.style, {\n                background: isActive ? this.theme.ui.accentBg : 'transparent',\n                color: isActive ? this.theme.ui.accentText : this.theme.axisText,\n                borderLeft: isActive\n                    ? `2px solid ${this.theme.ui.accent}`\n                    : '2px solid transparent',\n                fontWeight: isActive ? '500' : '400',\n            });\n        }\n    }\n\n    // ── Private – content rendering ───────────────────────────────────────────\n\n    private renderContent(): void {\n        this.content.innerHTML = '';\n        this.highlightActiveTab();\n\n        switch (this.activeTab) {\n            case 'appearance':\n                this.buildAppearanceSection();\n                break;\n            case 'trading':\n                this.buildTradingSection();\n                break;\n        }\n    }\n\n    // ── Appearance ────────────────────────────────────────────────────────────\n\n    private buildAppearanceSection(): void {\n        // ── Theme row (label + toggle inline) ────────────────────────────────\n        if (this.enableThemeToggle) {\n            const themeRow = document.createElement('div');\n            Object.assign(themeRow.style, {\n                display: 'flex',\n                alignItems: 'center',\n                justifyContent: 'space-between',\n                paddingBottom: '10px',\n                borderBottom: `1px solid ${this.theme.axisBorder}`,\n            });\n\n            const themeLabel = document.createElement('span');\n            themeLabel.textContent = 'Theme';\n            Object.assign(themeLabel.style, {\n                color: this.theme.tooltip.text,\n                fontSize: '13px',\n                fontWeight: '600',\n            });\n\n            themeRow.append(themeLabel, this.makeThemeToggle());\n            this.content.appendChild(themeRow);\n        }\n\n        // ── Colors ─────────────────────────────────────────────────────────────\n        this.content.appendChild(this.makeSectionHeader('Colors'));\n        this.content.appendChild(this.buildColorRows());\n\n        // ── Chart elements ────────────────────────────────────────────────────\n        this.content.appendChild(this.makeSectionHeader('Chart elements'));\n        this.content.appendChild(\n            this.makeHorizontalSettingRow(\n                'Price-axis countdown',\n                'Show the candle close countdown on the right price axis.',\n                this.makeBooleanToggle(this.current.showPriceAxisCountdown, (v) => {\n                    this.current.showPriceAxisCountdown = v;\n                    this.emit();\n                }),\n            ),\n        );\n    }\n\n    /**\n     * Reusable on/off toggle switch (track + animated thumb). Optional left/right\n     * side-labels animate their weight and color as the switch flips.\n     */\n    private makeBooleanToggle(\n        initial: boolean,\n        onChange: (v: boolean) => void,\n        sideLabels?: { off: string; on: string },\n    ): HTMLDivElement {\n        let value = initial;\n\n        const wrap = document.createElement('div');\n        Object.assign(wrap.style, {\n            display: 'flex',\n            alignItems: 'center',\n            gap: '8px',\n        });\n\n        const offLbl = sideLabels ? document.createElement('span') : null;\n        const onLbl = sideLabels ? document.createElement('span') : null;\n        if (offLbl && onLbl && sideLabels) {\n            offLbl.textContent = sideLabels.off;\n            onLbl.textContent = sideLabels.on;\n        }\n\n        const updateLabels = () => {\n            if (!offLbl || !onLbl) return;\n            Object.assign(offLbl.style, {\n                color: value ? this.theme.axisText : this.theme.tooltip.text,\n                fontWeight: value ? '400' : '500',\n                fontSize: '11px',\n                cursor: 'pointer',\n                userSelect: 'none',\n            });\n            Object.assign(onLbl.style, {\n                color: value ? this.theme.tooltip.text : this.theme.axisText,\n                fontWeight: value ? '500' : '400',\n                fontSize: '11px',\n                cursor: 'pointer',\n                userSelect: 'none',\n            });\n        };\n\n        const track = document.createElement('div');\n        Object.assign(track.style, {\n            position: 'relative',\n            width: '36px',\n            height: '20px',\n            borderRadius: '10px',\n            cursor: 'pointer',\n            flexShrink: '0',\n            transition: 'background 0.18s',\n            background: this.theme.axisBorder,\n            border: `1px solid ${this.theme.axisText}50`,\n            boxSizing: 'border-box',\n        });\n\n        const thumb = document.createElement('div');\n        Object.assign(thumb.style, {\n            position: 'absolute',\n            top: '2px',\n            left: value ? '18px' : '2px',\n            width: '14px',\n            height: '14px',\n            borderRadius: '50%',\n            background: this.theme.ui.accent,\n            transition: 'left 0.18s',\n            pointerEvents: 'none',\n        });\n        track.appendChild(thumb);\n\n        const doToggle = () => {\n            value = !value;\n            thumb.style.left = value ? '18px' : '2px';\n            updateLabels();\n            onChange(value);\n        };\n\n        track.addEventListener('click', doToggle);\n        if (offLbl && onLbl) {\n            offLbl.addEventListener('click', () => {\n                if (value) doToggle();\n            });\n            onLbl.addEventListener('click', () => {\n                if (!value) doToggle();\n            });\n        }\n\n        updateLabels();\n        if (offLbl && onLbl) {\n            wrap.append(offLbl, track, onLbl);\n        } else {\n            wrap.append(track);\n        }\n        return wrap;\n    }\n\n    private makeThemeToggle(): HTMLDivElement {\n        return this.makeBooleanToggle(\n            this.current.theme === 'light',\n            (isLight) => {\n                this.current.theme = isLight ? 'light' : 'dark';\n                this.emit();\n                this.renderContent();\n            },\n            { off: 'Dark', on: 'Light' },\n        );\n    }\n\n    /**\n     * Renders all canvas colors as a label → swatch(es) grid.\n     * All swatch columns are pixel-aligned regardless of label length.\n     *\n     * Layout:  [label 1fr]  [swatch1 24px]  [swatch2 24px]\n     *\n     * Single-color rows leave swatch2 empty (the grid column is still reserved,\n     * keeping swatch1 aligned with paired rows).\n     */\n    private buildColorRows(): HTMLDivElement {\n        const themeKey = this.current.theme;\n        const current = this.current.canvasColors?.[themeKey] ?? {};\n\n        const SWATCH = 24;\n        const GAP = 8;\n\n        const grid = document.createElement('div');\n        Object.assign(grid.style, {\n            display: 'grid',\n            gridTemplateColumns: `max-content ${SWATCH}px ${SWATCH}px`,\n            columnGap: `${GAP}px`,\n            rowGap: '8px',\n            padding: '8px 0 4px',\n            alignItems: 'center',\n        });\n\n        type SwatchDef = { field: keyof CanvasColorSettings; fallback: string };\n        type RowDef = { label: string; s1: SwatchDef; s2?: SwatchDef };\n\n        const rows: RowDef[] = [\n            { label: 'Background', s1: { field: 'background', fallback: this.theme.background } },\n            { label: 'Grid', s1: { field: 'grid', fallback: this.theme.grid } },\n            { label: 'Axis Text', s1: { field: 'axisText', fallback: this.theme.axisText } },\n            { label: 'Axis Border', s1: { field: 'axisBorder', fallback: this.theme.axisBorder } },\n            { label: 'Crosshair', s1: { field: 'crosshair', fallback: this.theme.crosshair } },\n            {\n                label: 'Candle Body',\n                s1: { field: 'candleUp', fallback: this.theme.candle.up },\n                s2: { field: 'candleDown', fallback: this.theme.candle.down },\n            },\n            {\n                label: 'Candle Wick',\n                s1: { field: 'wickUp', fallback: this.theme.candle.wickUp },\n                s2: { field: 'wickDown', fallback: this.theme.candle.wickDown },\n            },\n            {\n                label: 'Candle Border',\n                s1: {\n                    field: 'borderUp',\n                    fallback: this.theme.candle.borderUp ?? this.theme.candle.up,\n                },\n                s2: {\n                    field: 'borderDown',\n                    fallback: this.theme.candle.borderDown ?? this.theme.candle.down,\n                },\n            },\n            {\n                label: 'Volume',\n                s1: { field: 'volumeUp', fallback: this.theme.volume.up },\n                s2: { field: 'volumeDown', fallback: this.theme.volume.down },\n            },\n        ];\n\n        const makeSwatch = (def: SwatchDef) =>\n            this.makeColorSwatch(current[def.field] ?? def.fallback, (hex) => {\n                if (!this.current.canvasColors) this.current.canvasColors = {};\n                if (!this.current.canvasColors[themeKey]) this.current.canvasColors[themeKey] = {};\n                (this.current.canvasColors[themeKey] as Partial<CanvasColorSettings>)[def.field] =\n                    hex;\n                this.emit();\n            });\n\n        for (const { label, s1, s2 } of rows) {\n            // Col 1 — label\n            const lbl = document.createElement('span');\n            lbl.textContent = label;\n            Object.assign(lbl.style, {\n                color: this.theme.axisText,\n                fontSize: '11px',\n                paddingRight: '12px',\n            });\n\n            // Col 2 — primary swatch\n            const sw1 = makeSwatch(s1);\n            sw1.style.width = `${SWATCH}px`;\n            sw1.style.height = `${SWATCH}px`;\n\n            // Col 3 — secondary swatch or empty spacer\n            let col3: HTMLElement;\n            if (s2) {\n                col3 = makeSwatch(s2);\n                col3.style.width = `${SWATCH}px`;\n                col3.style.height = `${SWATCH}px`;\n            } else {\n                col3 = document.createElement('span');\n            }\n\n            grid.append(lbl, sw1, col3);\n        }\n\n        return grid;\n    }\n\n    /** A 24×24 color swatch backed by a hidden <input type=\"color\">. */\n    private makeColorSwatch(initialHex: string, onChange: (hex: string) => void): HTMLDivElement {\n        // Semi-transparent axisText gives a visible border in both dark and light themes.\n        // (axisBorder alone is #1c2a35 in dark mode — nearly invisible against the panel.)\n        const borderColor = `${this.theme.axisText}80`; // 50% alpha via 8-digit hex\n        const wrap = document.createElement('div');\n        Object.assign(wrap.style, {\n            position: 'relative',\n            width: '28px',\n            height: '28px',\n            borderRadius: '6px',\n            overflow: 'hidden',\n            cursor: 'pointer',\n            border: `1.5px solid ${borderColor}`,\n            flexShrink: '0',\n            boxSizing: 'border-box',\n        });\n\n        const swatch = document.createElement('div');\n        Object.assign(swatch.style, {\n            position: 'absolute',\n            inset: '0',\n            background: initialHex,\n        });\n\n        const input = document.createElement('input');\n        input.type = 'color';\n        input.value = initialHex;\n        Object.assign(input.style, {\n            position: 'absolute',\n            inset: '0',\n            opacity: '0',\n            width: '100%',\n            height: '100%',\n            cursor: 'pointer',\n            padding: '0',\n            border: 'none',\n        });\n\n        let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n        input.addEventListener('input', () => {\n            swatch.style.background = input.value;\n            if (debounceTimer !== null) clearTimeout(debounceTimer);\n            debounceTimer = setTimeout(() => {\n                debounceTimer = null;\n                onChange(input.value);\n            }, 300);\n        });\n\n        wrap.append(swatch, input);\n        return wrap;\n    }\n\n    // ── Trading ───────────────────────────────────────────────────────────────\n\n    private buildTradingSection(): void {\n        const s = this.labels.settings;\n\n        this.content.appendChild(this.makeSectionHeader(s.tfcSection));\n\n        this.content.appendChild(\n            this.makeVerticalSettingRow(\n                s.showLabel,\n                'Controls which trade levels are displayed on the chart',\n                this.makeSegmented<TradeDisplayFilter>(\n                    [\n                        { value: 'all', label: s.showAll },\n                        { value: 'positions', label: s.showPositions },\n                        { value: 'orders', label: s.showOrders },\n                        { value: 'none', label: s.showNone },\n                    ],\n                    this.current.tradeDisplayFilter,\n                    (v) => {\n                        this.current.tradeDisplayFilter = v;\n                        this.emit();\n                    }\n                )\n            )\n        );\n\n        this.content.appendChild(\n            this.makeVerticalSettingRow(\n                s.positionStyleLabel,\n                'How open positions are rendered on the chart',\n                this.makeSegmented<PositionRenderStyle>(\n                    [\n                        { value: 'line', label: s.styleLine },\n                        { value: 'dot', label: s.styleDot },\n                    ],\n                    this.current.positionRenderStyle,\n                    (v) => {\n                        this.current.positionRenderStyle = v;\n                        this.emit();\n                    }\n                )\n            )\n        );\n\n        this.content.appendChild(\n            this.makeHorizontalSettingRow(\n                'Always show SL/TP',\n                'Keep stop-loss and take-profit lines visible without hovering.',\n                this.makeBooleanToggle(this.current.showTradeLevelsAlways, (v) => {\n                    this.current.showTradeLevelsAlways = v;\n                    this.emit();\n                }),\n            ),\n        );\n    }\n\n    // ── Private – helpers ─────────────────────────────────────────────────────\n\n    private makeSectionHeader(label: string, first = false): HTMLDivElement {\n        const el = document.createElement('div');\n        el.textContent = label;\n        Object.assign(el.style, {\n            color: this.theme.tooltip.text,\n            fontSize: '13px',\n            fontWeight: '600',\n            paddingBottom: '10px',\n            marginTop: first ? '0' : '20px',\n            marginBottom: '2px',\n            borderBottom: `1px solid ${this.theme.axisBorder}`,\n        });\n        return el;\n    }\n\n    private makeVerticalSettingRow(\n        label: string,\n        desc: string,\n        control: HTMLElement\n    ): HTMLDivElement {\n        const row = document.createElement('div');\n        Object.assign(row.style, {\n            display: 'flex',\n            flexDirection: 'column',\n            gap: '12px',\n            padding: '14px 0',\n            borderBottom: `1px solid ${this.theme.axisBorder}`,\n        });\n\n        const textGroup = document.createElement('div');\n        Object.assign(textGroup.style, {\n            display: 'flex',\n            flexDirection: 'column',\n            gap: '0px',\n        });\n\n        const labelEl = document.createElement('span');\n        labelEl.textContent = label;\n        Object.assign(labelEl.style, {\n            color: this.theme.tooltip.text,\n            fontSize: '12px',\n            fontWeight: '500',\n        });\n\n        const descEl = document.createElement('span');\n        descEl.textContent = desc;\n        Object.assign(descEl.style, {\n            color: this.theme.axisText,\n            fontSize: '10px',\n        });\n\n        textGroup.append(labelEl, descEl);\n\n        Object.assign(control.style, {\n            width: 'fit-content',\n            border: `1px solid ${this.theme.axisText}`,\n            borderRadius: '6px',\n            overflow: 'hidden',\n        });\n        row.append(textGroup, control);\n        return row;\n    }\n\n    /**\n     * Like makeVerticalSettingRow, but the control is placed on the right side\n     * on the same line as the label, vertically centered.\n     */\n    private makeHorizontalSettingRow(\n        label: string,\n        desc: string,\n        control: HTMLElement\n    ): HTMLDivElement {\n        const row = document.createElement('div');\n        Object.assign(row.style, {\n            display: 'flex',\n            flexDirection: 'row',\n            alignItems: 'center',\n            justifyContent: 'space-between',\n            gap: '12px',\n            padding: '14px 0',\n            borderBottom: `1px solid ${this.theme.axisBorder}`,\n        });\n\n        const textGroup = document.createElement('div');\n        Object.assign(textGroup.style, {\n            display: 'flex',\n            flexDirection: 'column',\n            gap: '0px',\n            flex: '1',\n            minWidth: '0',\n        });\n\n        const labelEl = document.createElement('span');\n        labelEl.textContent = label;\n        Object.assign(labelEl.style, {\n            color: this.theme.tooltip.text,\n            fontSize: '12px',\n            fontWeight: '500',\n        });\n\n        const descEl = document.createElement('span');\n        descEl.textContent = desc;\n        Object.assign(descEl.style, {\n            color: this.theme.axisText,\n            fontSize: '10px',\n        });\n\n        textGroup.append(labelEl, descEl);\n\n        const controlWrap = document.createElement('div');\n        Object.assign(controlWrap.style, {\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n            flexShrink: '0',\n        });\n        controlWrap.appendChild(control);\n\n        row.append(textGroup, controlWrap);\n        return row;\n    }\n\n    /** Segmented control (pill-style button group). */\n    private makeSegmented<T extends string>(\n        options: Array<{ value: T; label: string }>,\n        current: T,\n        onChange: (v: T) => void\n    ): HTMLDivElement {\n        const wrap = document.createElement('div');\n        Object.assign(wrap.style, {\n            display: 'inline-flex',\n            borderRadius: '6px',\n            border: `1px solid ${this.theme.axisText}`,\n            overflow: 'hidden',\n            flexShrink: '0',\n        });\n\n        const btns: HTMLButtonElement[] = [];\n\n        for (const opt of options) {\n            const btn = document.createElement('button');\n            const isActive = opt.value === current;\n\n            Object.assign(btn.style, {\n                padding: '5px 14px',\n                fontSize: '11px',\n                fontFamily: \"'Inter', system-ui, sans-serif\",\n                background: isActive ? this.theme.ui.accent : 'transparent',\n                color: isActive ? '#ffffff' : this.theme.axisText,\n                border: 'none',\n                borderRight: `1px solid ${this.theme.axisText}`,\n                cursor: 'pointer',\n                outline: 'none',\n                transition: 'background 0.12s, color 0.12s',\n                whiteSpace: 'nowrap',\n                textAlign: 'center',\n            });\n            // remove right border from last item\n            if (opt === options[options.length - 1]) {\n                btn.style.borderRight = 'none';\n            }\n\n            btn.textContent = opt.label;\n\n            btn.addEventListener('mouseenter', () => {\n                if (current !== opt.value) {\n                    btn.style.background = this.theme.ui.accentBg;\n                    btn.style.color = this.theme.ui.accentText;\n                }\n            });\n            btn.addEventListener('mouseleave', () => {\n                if (current !== opt.value) {\n                    btn.style.background = 'transparent';\n                    btn.style.color = this.theme.axisText;\n                }\n            });\n            btn.addEventListener('click', () => {\n                current = opt.value;\n                for (const b of btns) {\n                    b.style.background = 'transparent';\n                    b.style.color = this.theme.axisText;\n                }\n                btn.style.background = this.theme.ui.accent;\n                btn.style.color = '#ffffff';\n                onChange(opt.value);\n            });\n\n            btns.push(btn);\n            wrap.appendChild(btn);\n        }\n\n        return wrap;\n    }\n}\n","import type { ChartTheme } from '../core/themes.js';\nimport { DEFAULT_LABELS, type TradeLabels } from '../core/labels.js';\nimport { DEFAULT_TRADE_BUTTON_CONFIG, type TradeButtonUiConfig } from '../core/uiConfig.js';\nimport { ICON_PLUS_CIRCLE } from './icons.js';\n\n/**\n * Floating ⊕ button that tracks mouse-Y along the right edge of the price pane.\n * Lives inside `canvasWrap` (position:absolute).\n */\nexport class TradeButton {\n    readonly el: HTMLButtonElement;\n    private theme: ChartTheme;\n    private cfg: TradeButtonUiConfig;\n    private _visible = false;\n    private _isMobile = false;\n\n    constructor(\n        theme: ChartTheme,\n        priceAxisWidth: number,\n        onClick: () => void,\n        labels: TradeLabels = DEFAULT_LABELS.trade,\n        cfg: TradeButtonUiConfig = DEFAULT_TRADE_BUTTON_CONFIG,\n    ) {\n        this.theme = theme;\n        this.cfg   = cfg;\n\n        this.el = document.createElement('button');\n        this.el.innerHTML = ICON_PLUS_CIRCLE;\n        this.el.title = labels.placeOrderTitle;\n        Object.assign(this.el.style, {\n            position:     'absolute',\n            right:        `${priceAxisWidth + 26}px`,\n            top:          '0',\n            width:        `${cfg.size}px`,\n            height:       `${cfg.size}px`,\n            borderRadius: '50%',\n            border:       `1px solid ${theme.axisBorder}`,\n            background:   theme.tooltip.background,\n            color:        theme.axisText,\n            fontSize:     '14px',\n            lineHeight:   '1',\n            display:      'none',\n            alignItems:   'center',\n            justifyContent: 'center',\n            cursor:       'pointer',\n            padding:      '0',\n            fontFamily: \"'Inter', system-ui, sans-serif\",\n            zIndex:       '15',\n            transform:    'translateY(-50%)',\n            transition:   'opacity 0.1s',\n            pointerEvents: 'auto',\n            userSelect:   'none',\n        });\n        // Apply initial icon size from config.\n        this.applyIconSize(cfg.iconSize);\n\n        this.el.addEventListener('click', (e) => {\n            e.stopPropagation();\n            onClick();\n        });\n        // Prevent mouseleave on the canvas wrapper when moving onto the button\n        this.el.addEventListener('mouseenter', () => {\n            this.el.style.opacity = '1';\n            Object.assign(this.el.style, {\n                background: theme.tooltip.background,\n                color:      theme.tradeLevels.buySide,\n                border:     `1px solid ${theme.tradeLevels.buySide}`,\n            });\n        });\n        this.el.addEventListener('mouseleave', (e) => {\n            Object.assign(this.el.style, {\n                background: this.theme.tooltip.background,\n                color:      this.theme.axisText,\n                border:     `1px solid ${this.theme.axisBorder}`,\n            });\n            // If cursor left the button but NOT back onto the canvas, hide the button\n            const related = e.relatedTarget as HTMLElement | null;\n            if (!related || !this.el.parentElement?.contains(related)) {\n                this.hide();\n            }\n        });\n    }\n\n    /** Move button to Y pixel position within canvasWrap */\n    setY(y: number): void {\n        this.el.style.top = `${y}px`;\n    }\n\n    show(): void {\n        if (this._visible) return;\n        this._visible = true;\n        this.el.style.display = 'flex';\n    }\n\n    hide(): void {\n        if (!this._visible) return;\n        this._visible = false;\n        this.el.style.display = 'none';\n    }\n\n    setTheme(theme: ChartTheme, priceAxisWidth: number): void {\n        this.theme = theme;\n        Object.assign(this.el.style, {\n            border:     `1px solid ${theme.axisBorder}`,\n            background: theme.tooltip.background,\n            color:      theme.axisText,\n            right:      `${priceAxisWidth + 26}px`,\n        });\n    }\n\n    /**\n     * Toggle mobile sizing. When `isMobile` is true, the button diameter and\n     * inner SVG icon are swapped for the configured mobile values; when false,\n     * they revert to desktop values.\n     */\n    setMobileMode(isMobile: boolean): void {\n        if (this._isMobile === isMobile) return;\n        this._isMobile = isMobile;\n        const size     = isMobile ? this.cfg.mobileSize     : this.cfg.size;\n        const iconSize = isMobile ? this.cfg.mobileIconSize : this.cfg.iconSize;\n        this.el.style.width  = `${size}px`;\n        this.el.style.height = `${size}px`;\n        this.applyIconSize(iconSize);\n    }\n\n    private applyIconSize(size: number): void {\n        const svg = this.el.querySelector('svg');\n        if (svg) {\n            svg.setAttribute('width', String(size));\n            svg.setAttribute('height', String(size));\n        }\n    }\n}\n","import type { ChartTheme } from '../core/themes.js';\nimport { DEFAULT_LABELS, type TradeLabels } from '../core/labels.js';\n\n/**\n * Small Buy/Sell popover anchored next to the trade button.\n * Rows show the dynamic order type (Limit / Stop) based on cursor price\n * relative to the market price. Clicking a row creates a draft level instead\n * of calling onOrderSubmit directly.\n */\nexport class TradePopover {\n    readonly el: HTMLDivElement;\n    private theme:         ChartTheme;\n    private labels:        TradeLabels;\n    private lots:          number;\n    private symbol:        string;\n    private onDraftCreate: (side: 'buy' | 'sell', price: number, orderType: 'limit' | 'stop') => void;\n    private _price          = 0;\n    private _pricePrecision = 2;\n    private _buyOrderType:  'limit' | 'stop' = 'limit';\n    private _sellOrderType: 'limit' | 'stop' = 'limit';\n    private _compact        = false;\n    private onVisibilityChange?: () => void;\n\n    constructor(\n        theme:         ChartTheme,\n        lots:          number,\n        symbol:        string,\n        onDraftCreate: (side: 'buy' | 'sell', price: number, orderType: 'limit' | 'stop') => void,\n        labels:        TradeLabels = DEFAULT_LABELS.trade,\n        onVisibilityChange?: () => void,\n    ) {\n        this.theme         = theme;\n        this.lots          = lots;\n        this.symbol        = symbol;\n        this.onDraftCreate = onDraftCreate;\n        this.labels        = labels;\n        this.onVisibilityChange = onVisibilityChange;\n\n        this.el = document.createElement('div');\n        Object.assign(this.el.style, {\n            position:      'absolute',\n            display:       'none',\n            flexDirection: 'column',\n            background:    theme.tooltip.background,\n            border:        `1px solid ${theme.axisBorder}`,\n            borderRadius:  '5px',\n            padding:       '4px',\n            zIndex:        '20',\n            boxShadow:     '0 4px 16px rgba(0,0,0,0.25)',\n            fontFamily:    \"'Inter', system-ui, sans-serif\",\n            fontSize:      '12px',\n            width:         'max-content',\n            pointerEvents: 'auto',\n        });\n\n        document.addEventListener('mousedown', this.onDocMouseDown);\n    }\n\n    // ── Public ────────────────────────────────────────────────────────────────\n\n    show(\n        price:          number,\n        buttonY:        number,\n        buttonRight:    number,\n        pricePrecision  = 2,\n        buyOrderType:   'limit' | 'stop' = 'limit',\n        sellOrderType:  'limit' | 'stop' = 'limit',\n    ): void {\n        const wasVisible = this.isVisible;\n        this._price          = price;\n        this._pricePrecision = pricePrecision;\n        this._buyOrderType   = buyOrderType;\n        this._sellOrderType  = sellOrderType;\n        this.rebuild();\n        this.el.style.display = 'flex';\n\n        this.el.style.right = `${buttonRight}px`;\n        this.el.style.top   = `${buttonY - 16}px`;\n\n        if (!wasVisible) this.onVisibilityChange?.();\n    }\n\n    hide(): void {\n        const wasVisible = this.isVisible;\n        this.el.style.display = 'none';\n        if (wasVisible) this.onVisibilityChange?.();\n    }\n\n    get isVisible(): boolean {\n        return this.el.style.display !== 'none';\n    }\n\n    setLots(lots: number): void {\n        this.lots = lots;\n    }\n\n    setSymbol(symbol: string): void {\n        this.symbol = symbol;\n    }\n\n    setCompact(compact: boolean): void {\n        this._compact = compact;\n    }\n\n    setTheme(theme: ChartTheme): void {\n        this.theme = theme;\n        Object.assign(this.el.style, {\n            background: theme.tooltip.background,\n            border:     `1px solid ${theme.axisBorder}`,\n        });\n    }\n\n    destroy(): void {\n        document.removeEventListener('mousedown', this.onDocMouseDown);\n    }\n\n    // ── Private ───────────────────────────────────────────────────────────────\n\n    private rebuild(): void {\n        this.el.innerHTML = '';\n\n        const divider = document.createElement('div');\n        Object.assign(divider.style, {\n            height:     '1px',\n            background: this.theme.axisBorder,\n            margin:     '0 8px',\n        });\n\n        this.el.append(\n            this.makeRow(this.theme.tradeLevels.sellSide, 'sell', this._sellOrderType),\n            divider,\n            this.makeRow(this.theme.tradeLevels.buySide,  'buy',  this._buyOrderType),\n        );\n    }\n\n    private makeRow(\n        color:     string,\n        side:      'buy' | 'sell',\n        orderType: 'limit' | 'stop',\n    ): HTMLButtonElement {\n        const btn = document.createElement('button');\n        Object.assign(btn.style, {\n            display:      'flex',\n            alignItems:   'center',\n            gap:          '8px',\n            width:        '100%',\n            background:   'transparent',\n            border:       'none',\n            borderRadius: '3px',\n            padding:      this._compact ? '5px 8px' : '8px 10px',\n            cursor:       'pointer',\n            fontFamily:   \"'Inter', system-ui, sans-serif\",\n            fontSize:     this._compact ? '11px' : '12px',\n        });\n\n        btn.appendChild(this.makeChevron(color, side));\n\n        const sideLabel      = side === 'sell' ? this.labels.sell : this.labels.buy;\n        const orderTypeLabel = orderType === 'limit' ? this.labels.limit : this.labels.stop;\n        const priceStr       = this._price.toFixed(this._pricePrecision);\n\n        const colored = document.createElement('span');\n        colored.textContent = `${sideLabel} ${orderTypeLabel}`;\n        Object.assign(colored.style, { color, fontWeight: '600' });\n\n        const plain = document.createElement('span');\n        plain.textContent = ` ${this.lots} ${this.symbol} ${this.labels.at} ${priceStr}`;\n        Object.assign(plain.style, { color: '#ffffff', fontWeight: '400' });\n\n        btn.append(colored, plain);\n\n        btn.addEventListener('mouseenter', () => { btn.style.background = 'rgba(255,255,255,0.06)'; });\n        btn.addEventListener('mouseleave', () => { btn.style.background = 'transparent'; });\n        btn.addEventListener('mousedown', (e) => {\n            e.stopPropagation();\n            this.onDraftCreate(side, this._price, orderType);\n            this.hide();\n        });\n        return btn;\n    }\n\n    private makeChevron(color: string, side: 'buy' | 'sell'): SVGSVGElement {\n        const ns  = 'http://www.w3.org/2000/svg';\n        const svg = document.createElementNS(ns, 'svg');\n        svg.setAttribute('width',   '10');\n        svg.setAttribute('height',  '8');\n        svg.setAttribute('viewBox', '0 0 10 8');\n        svg.style.flexShrink = '0';\n\n        const path = document.createElementNS(ns, 'path');\n        path.setAttribute('d', side === 'sell' ? 'M1 1 L5 7 L9 1' : 'M1 7 L5 1 L9 7');\n        path.setAttribute('stroke',           color);\n        path.setAttribute('fill',             'none');\n        path.setAttribute('stroke-width',     '1.5');\n        path.setAttribute('stroke-linecap',   'round');\n        path.setAttribute('stroke-linejoin',  'round');\n        svg.appendChild(path);\n        return svg;\n    }\n\n    private onDocMouseDown = (e: MouseEvent): void => {\n        if (this.isVisible && !this.el.contains(e.target as Node)) {\n            this.hide();\n        }\n    };\n}\n","import type { ChartTheme } from '../core/themes.js';\nimport type {\n    AnyDrawingStyle,\n    DrawingFibStyle,\n    DrawingTextStyle,\n    DrawingToolType,\n    IDrawing,\n} from '../core/types.js';\n\n/**\n * Per-type control set. Determines which controls the popover shows for a\n * selected drawing. Drawing types not listed default to ['stroke', 'width', 'style'].\n */\nconst POPOVER_CONTROLS: Partial<Record<DrawingToolType, ControlKey[]>> = {\n    // Lines & channels\n    horizontalLine:  ['stroke', 'width', 'style'],\n    verticalLine:    ['stroke', 'width', 'style'],\n    crossLine:       ['stroke', 'width', 'style'],\n    trendLine:       ['stroke', 'width', 'style'],\n    trendAngle:      ['stroke', 'width', 'style'],\n    parallelChannel: ['stroke', 'width', 'style', 'fill'],\n    flatChannel:     ['stroke', 'width', 'style', 'fill'],\n    disjointChannel: ['stroke', 'width', 'style'],\n    // Geometric shapes\n    rectangle:        ['stroke', 'width', 'style', 'fill'],\n    rotatedRectangle: ['stroke', 'width', 'style', 'fill'],\n    ellipse:          ['stroke', 'width', 'style', 'fill'],\n    circle:           ['stroke', 'width', 'style', 'fill'],\n    triangle:         ['stroke', 'width', 'style', 'fill'],\n    arc:              ['stroke', 'width', 'style'],\n    path:             ['stroke', 'width', 'style'],\n    polyline:         ['stroke', 'width', 'style'],\n    sineLine:         ['stroke', 'width', 'style'],\n    brush:            ['stroke', 'width'],\n    highlighter:      ['stroke', 'width'],\n    // Fib (per-level)\n    fibRetracement:  ['width', 'style', 'fibLevels'],\n    fibExtension:    ['width', 'style', 'fibLevels'],\n    fibProjection:   ['width', 'style', 'fibLevels'],\n    fibChannel:      ['stroke', 'width', 'style'],\n    fibFan:          ['stroke', 'width', 'style'],\n    fibCircles:      ['stroke', 'width', 'style'],\n    fibSpiral:       ['stroke', 'width', 'style'],\n    fibTimezone:     ['stroke', 'width', 'style'],\n    // Gann\n    gannFan:    ['stroke', 'width', 'style'],\n    gannSquare: ['stroke', 'width', 'style'],\n    gannBox:    ['stroke', 'width', 'style', 'fill'],\n    // Pitchfork\n    pitchfork:       ['stroke', 'width', 'style'],\n    schiffPitchfork: ['stroke', 'width', 'style'],\n    modifiedSchiff:  ['stroke', 'width', 'style'],\n    insidePitchfork: ['stroke', 'width', 'style'],\n    // Text-bearing\n    text:         ['text'],\n    callout:      ['text', 'stroke', 'fill'],\n    priceLabel:   ['text', 'fill'],\n    priceNote:    ['text', 'stroke'],\n    anchoredNote: ['text', 'stroke', 'fill'],\n    // Arrows / markers\n    arrowUp:     ['stroke', 'fill'],\n    arrowDown:   ['stroke', 'fill'],\n    arrowMarker: ['stroke', 'fill'],\n    flag:        ['stroke', 'fill'],\n    // Volume profile\n    volumeProfile: ['stroke', 'fill'],\n    anchoredVP:    ['stroke', 'fill'],\n    fixedRangeVP:  ['stroke', 'fill'],\n    // Measurement\n    priceRange:     ['stroke', 'fill'],\n    dateRange:      ['stroke', 'width', 'style'],\n    datePriceRange: ['stroke', 'fill'],\n    ruler:          ['stroke', 'width', 'style'],\n    // Advanced\n    regressionTrend: ['stroke', 'width', 'style'],\n    projection:      ['stroke', 'width', 'style'],\n    cyclicLines:     ['stroke', 'width', 'style'],\n    timeCycles:      ['stroke', 'width', 'style', 'fill'],\n    priceProjection: ['stroke', 'fill'],\n    ghostFeed:       ['stroke', 'fill'],\n};\n\ntype ControlKey = 'stroke' | 'width' | 'style' | 'fill' | 'text' | 'fibLevels';\n\nconst LINE_WIDTHS = [1, 2, 3, 4];\nconst FONT_SIZES = [10, 11, 12, 13, 14, 16, 18, 20, 24];\nconst SWATCH_PX = 24;\n\n/**\n * Floating popover that appears next to the selected drawing and lets the user\n * tweak its per-instance style (color, width, line style, fill, text, fib levels).\n * Each control is a labelled group; color swatches reuse the same pattern as\n * ChartSettingsDialog (`makeColorSwatch` — native `<input type=\"color\">`).\n */\nexport class DrawingStylePopover {\n    readonly el: HTMLDivElement;\n    private theme: ChartTheme;\n    private container: HTMLElement;\n    private onChange: (id: string, patch: Partial<AnyDrawingStyle>) => void;\n    private currentDrawing: IDrawing | null = null;\n    private fibLevelsExpanded = false;\n    private fibPanel: HTMLDivElement | null = null;\n\n    constructor(\n        container: HTMLElement,\n        theme: ChartTheme,\n        onChange: (id: string, patch: Partial<AnyDrawingStyle>) => void,\n    ) {\n        this.container = container;\n        this.theme = theme;\n        this.onChange = onChange;\n\n        this.el = document.createElement('div');\n        Object.assign(this.el.style, {\n            position:      'absolute',\n            display:       'none',\n            flexDirection: 'row',\n            alignItems:    'center',\n            gap:           '10px',\n            background:    theme.tooltip.background,\n            border:        `1px solid ${theme.axisBorder}`,\n            borderRadius:  '8px',\n            padding:       '8px 10px',\n            zIndex:        '50',\n            boxShadow:     '0 6px 18px rgba(0,0,0,0.35)',\n            fontFamily:    \"'Inter', system-ui, sans-serif\",\n            fontSize:      '11px',\n            color:         theme.tooltip.text,\n            pointerEvents: 'auto',\n            userSelect:    'none',\n            whiteSpace:    'nowrap',\n        });\n        container.appendChild(this.el);\n    }\n\n    setTheme(theme: ChartTheme): void {\n        this.theme = theme;\n        this.el.style.background = theme.tooltip.background;\n        this.el.style.border = `1px solid ${theme.axisBorder}`;\n        this.el.style.color = theme.tooltip.text;\n        if (this.currentDrawing) this.rebuild();\n    }\n\n    /** Show the popover for a drawing, positioned at (x, y) in container-relative coords. */\n    show(drawing: IDrawing, x: number, y: number): void {\n        const wasSameId = this.currentDrawing?.id === drawing.id;\n        this.currentDrawing = drawing;\n        if (!wasSameId) {\n            this.fibLevelsExpanded = false;\n            this.rebuild();\n        }\n        this.el.style.display = 'flex';\n        this.setAnchor(x, y);\n    }\n\n    /** Reposition the popover without rebuilding controls. */\n    setAnchor(x: number, y: number): void {\n        requestAnimationFrame(() => {\n            const rect = this.el.getBoundingClientRect();\n            const cRect = this.container.getBoundingClientRect();\n            const w = rect.width || 240;\n            const h = rect.height || 56;\n            let left = x - w / 2;\n            let top  = y - h - 12;\n            if (top < 4) top = y + 16; // flip below if no room above\n            left = Math.max(4, Math.min(cRect.width - w - 4, left));\n            top  = Math.max(4, Math.min(cRect.height - h - 4, top));\n            this.el.style.left = `${left}px`;\n            this.el.style.top  = `${top}px`;\n        });\n    }\n\n    hide(): void {\n        this.el.style.display = 'none';\n        this.currentDrawing = null;\n        this.fibLevelsExpanded = false;\n        this.fibPanel?.remove();\n        this.fibPanel = null;\n    }\n\n    destroy(): void {\n        this.fibPanel?.remove();\n        this.el.remove();\n        this.currentDrawing = null;\n    }\n\n    // ── Build ────────────────────────────────────────────────────────────────\n\n    private rebuild(): void {\n        this.el.innerHTML = '';\n        if (!this.currentDrawing) return;\n\n        const controls = POPOVER_CONTROLS[this.currentDrawing.type] ?? ['stroke', 'width', 'style'];\n        const style = (this.currentDrawing.style ?? {}) as AnyDrawingStyle & DrawingTextStyle & DrawingFibStyle;\n        const themeEntry = (this.theme.drawing[this.currentDrawing.type] ?? {}) as AnyDrawingStyle & DrawingTextStyle & DrawingFibStyle;\n\n        const groups: HTMLElement[] = [];\n\n        for (const key of controls) {\n            switch (key) {\n                case 'stroke':\n                    groups.push(this.group('Color',\n                        this.makeColorSwatch(\n                            style.strokeColor ?? themeEntry.strokeColor ?? '#888888',\n                            (hex) => this.emit({ strokeColor: hex }),\n                        ),\n                    ));\n                    break;\n                case 'width':\n                    groups.push(this.group('Width',\n                        this.buildWidth(\n                            style.lineWidth ?? themeEntry.lineWidth ?? 1,\n                            (w) => this.emit({ lineWidth: w }),\n                        ),\n                    ));\n                    break;\n                case 'style':\n                    groups.push(this.group('Style',\n                        this.buildLineStyle(\n                            style.lineStyle ?? themeEntry.lineStyle ?? 'solid',\n                            (s) => this.emit({ lineStyle: s }),\n                        ),\n                    ));\n                    break;\n                case 'fill': {\n                    const fillRow = document.createElement('div');\n                    Object.assign(fillRow.style, { display: 'flex', alignItems: 'center', gap: '6px' });\n                    fillRow.appendChild(this.makeColorSwatch(\n                        style.fillColor ?? themeEntry.fillColor ?? '#888888',\n                        (hex) => this.emit({ fillColor: hex }),\n                    ));\n                    fillRow.appendChild(this.buildOpacity(\n                        style.fillOpacity ?? themeEntry.fillOpacity ?? 0.1,\n                        (o) => this.emit({ fillOpacity: o }),\n                    ));\n                    groups.push(this.group('Fill', fillRow));\n                    break;\n                }\n                case 'text': {\n                    const textRow = document.createElement('div');\n                    Object.assign(textRow.style, { display: 'flex', alignItems: 'center', gap: '6px' });\n                    textRow.appendChild(this.makeColorSwatch(\n                        style.textColor ?? themeEntry.textColor ?? '#f5f5f5',\n                        (hex) => this.emit({ textColor: hex } as Partial<DrawingTextStyle>),\n                    ));\n                    textRow.appendChild(this.buildFontSize(\n                        style.fontSize ?? themeEntry.fontSize ?? 13,\n                        (size) => this.emit({ fontSize: size } as Partial<DrawingTextStyle>),\n                    ));\n                    groups.push(this.group('Text', textRow));\n                    break;\n                }\n                case 'fibLevels':\n                    groups.push(this.group('Levels',\n                        this.buildFibLevelsButton({ ...(themeEntry.levels ?? {}), ...(style.levels ?? {}) }),\n                    ));\n                    break;\n            }\n        }\n\n        // Insert separators between groups\n        groups.forEach((g, i) => {\n            if (i > 0) this.el.appendChild(this.makeSeparator());\n            this.el.appendChild(g);\n        });\n    }\n\n    // ── Layout helpers ───────────────────────────────────────────────────────\n\n    private group(label: string, control: HTMLElement): HTMLDivElement {\n        const wrap = document.createElement('div');\n        Object.assign(wrap.style, {\n            display: 'flex',\n            flexDirection: 'column',\n            alignItems: 'flex-start',\n            gap: '4px',\n        });\n        const lbl = document.createElement('span');\n        lbl.textContent = label;\n        Object.assign(lbl.style, {\n            fontSize: '10px',\n            color: this.theme.axisText,\n            textTransform: 'uppercase',\n            letterSpacing: '0.5px',\n            lineHeight: '1',\n        });\n        wrap.appendChild(lbl);\n        wrap.appendChild(control);\n        return wrap;\n    }\n\n    private makeSeparator(): HTMLDivElement {\n        const sep = document.createElement('div');\n        Object.assign(sep.style, {\n            width: '1px',\n            height: '32px',\n            background: this.theme.axisBorder,\n            opacity: '0.6',\n        });\n        return sep;\n    }\n\n    // ── Controls ────────────────────────────────────────────────────────────\n\n    /**\n     * 24×24 color swatch backed by a hidden `<input type=\"color\">`. Mirrors\n     * `ChartSettingsDialog.makeColorSwatch` so all color pickers in the app\n     * share the same look.\n     */\n    private makeColorSwatch(initialHex: string, onChange: (hex: string) => void): HTMLDivElement {\n        const borderColor = `${this.theme.axisText}80`; // 50% alpha\n        const safeHex = initialHex.length === 7 && initialHex.startsWith('#') ? initialHex : '#888888';\n\n        const wrap = document.createElement('div');\n        Object.assign(wrap.style, {\n            position: 'relative',\n            width: `${SWATCH_PX}px`,\n            height: `${SWATCH_PX}px`,\n            borderRadius: '6px',\n            overflow: 'hidden',\n            cursor: 'pointer',\n            border: `1.5px solid ${borderColor}`,\n            flexShrink: '0',\n            boxSizing: 'border-box',\n        });\n\n        const swatch = document.createElement('div');\n        Object.assign(swatch.style, {\n            position: 'absolute',\n            inset: '0',\n            background: initialHex,\n        });\n\n        const input = document.createElement('input');\n        input.type = 'color';\n        input.value = safeHex;\n        Object.assign(input.style, {\n            position: 'absolute',\n            inset: '0',\n            opacity: '0',\n            width: '100%',\n            height: '100%',\n            cursor: 'pointer',\n            padding: '0',\n            border: 'none',\n        });\n\n        let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n        input.addEventListener('input', () => {\n            swatch.style.background = input.value;\n            if (debounceTimer !== null) clearTimeout(debounceTimer);\n            debounceTimer = setTimeout(() => {\n                debounceTimer = null;\n                onChange(input.value);\n            }, 200);\n        });\n\n        wrap.append(swatch, input);\n        return wrap;\n    }\n\n    private buildWidth(currentWidth: number, onPick: (w: number) => void): HTMLDivElement {\n        const wrap = document.createElement('div');\n        Object.assign(wrap.style, { display: 'flex', gap: '2px', alignItems: 'center' });\n        for (const w of LINE_WIDTHS) {\n            const btn = this.makeIconButton(`${w}px`);\n            const bar = document.createElement('div');\n            Object.assign(bar.style, {\n                width: '14px',\n                height: `${w}px`,\n                background: this.theme.tooltip.text,\n                borderRadius: '1px',\n            });\n            btn.appendChild(bar);\n            if (Math.round(currentWidth) === w) this.markActive(btn);\n            btn.addEventListener('click', () => onPick(w));\n            wrap.appendChild(btn);\n        }\n        return wrap;\n    }\n\n    private buildLineStyle(current: 'solid' | 'dashed' | 'dotted', onPick: (s: 'solid' | 'dashed' | 'dotted') => void): HTMLDivElement {\n        const wrap = document.createElement('div');\n        Object.assign(wrap.style, { display: 'flex', gap: '2px', alignItems: 'center' });\n        const styles: { key: 'solid' | 'dashed' | 'dotted'; svg: string; title: string }[] = [\n            { key: 'solid',  svg: this.lineSvg('solid'),  title: 'Solid' },\n            { key: 'dashed', svg: this.lineSvg('dashed'), title: 'Dashed' },\n            { key: 'dotted', svg: this.lineSvg('dotted'), title: 'Dotted' },\n        ];\n        for (const { key, svg, title } of styles) {\n            const btn = this.makeIconButton(title);\n            btn.innerHTML = svg;\n            if (key === current) this.markActive(btn);\n            btn.addEventListener('click', () => onPick(key));\n            wrap.appendChild(btn);\n        }\n        return wrap;\n    }\n\n    private lineSvg(style: 'solid' | 'dashed' | 'dotted'): string {\n        const dash = style === 'dashed' ? '4,2' : style === 'dotted' ? '1.5,2' : '';\n        return `<svg width=\"18\" height=\"10\" viewBox=\"0 0 18 10\"><line x1=\"1\" y1=\"5\" x2=\"17\" y2=\"5\" stroke=\"${this.theme.tooltip.text}\" stroke-width=\"1.5\" stroke-linecap=\"round\" ${dash ? `stroke-dasharray=\"${dash}\"` : ''} /></svg>`;\n    }\n\n    private buildOpacity(current: number, onChange: (o: number) => void): HTMLDivElement {\n        const wrap = document.createElement('div');\n        Object.assign(wrap.style, { display: 'flex', alignItems: 'center', gap: '4px' });\n        const slider = document.createElement('input');\n        slider.type = 'range';\n        slider.min = '0';\n        slider.max = '100';\n        slider.value = String(Math.round(current * 100));\n        Object.assign(slider.style, { width: '64px', accentColor: this.theme.ui.accent });\n        slider.title = 'Fill opacity';\n        const value = document.createElement('span');\n        value.textContent = `${slider.value}%`;\n        Object.assign(value.style, { fontSize: '10px', color: this.theme.axisText, minWidth: '26px', textAlign: 'right' });\n        slider.addEventListener('input', () => {\n            value.textContent = `${slider.value}%`;\n            onChange(Number(slider.value) / 100);\n        });\n        wrap.append(slider, value);\n        return wrap;\n    }\n\n    private buildFontSize(current: number, onPick: (size: number) => void): HTMLSelectElement {\n        const select = document.createElement('select');\n        Object.assign(select.style, {\n            background: this.theme.tooltip.background,\n            color: this.theme.tooltip.text,\n            border: `1px solid ${this.theme.axisBorder}`,\n            borderRadius: '4px',\n            padding: '3px 4px',\n            fontSize: '11px',\n            cursor: 'pointer',\n            height: `${SWATCH_PX}px`,\n            boxSizing: 'border-box',\n        });\n        for (const s of FONT_SIZES) {\n            const opt = document.createElement('option');\n            opt.value = String(s);\n            opt.textContent = `${s}px`;\n            if (s === current) opt.selected = true;\n            select.appendChild(opt);\n        }\n        select.addEventListener('change', () => onPick(Number(select.value)));\n        return select;\n    }\n\n    private buildFibLevelsButton(levels: Record<string, { visible: boolean; color: string }>): HTMLDivElement {\n        const wrap = document.createElement('div');\n        wrap.style.position = 'relative';\n\n        const btn = this.makeIconButton('Configure levels');\n        btn.style.padding = '0 8px';\n        btn.style.height = `${SWATCH_PX}px`;\n        btn.style.minWidth = '64px';\n        btn.textContent = 'Configure ▾';\n        wrap.appendChild(btn);\n\n        btn.addEventListener('click', (e) => {\n            e.stopPropagation();\n            this.fibLevelsExpanded = !this.fibLevelsExpanded;\n            if (this.fibLevelsExpanded) this.openFibPanel(btn, levels);\n            else this.closeFibPanel();\n        });\n        document.addEventListener('mousedown', (e) => {\n            if (this.fibPanel && !this.fibPanel.contains(e.target as Node) && !wrap.contains(e.target as Node)) {\n                this.closeFibPanel();\n                this.fibLevelsExpanded = false;\n            }\n        });\n\n        return wrap;\n    }\n\n    private openFibPanel(anchor: HTMLElement, levels: Record<string, { visible: boolean; color: string }>): void {\n        this.closeFibPanel();\n        const panel = document.createElement('div');\n        Object.assign(panel.style, {\n            position: 'absolute',\n            display: 'grid',\n            gridTemplateColumns: 'auto 1fr auto',\n            columnGap: '10px',\n            rowGap: '6px',\n            background: this.theme.tooltip.background,\n            border: `1px solid ${this.theme.axisBorder}`,\n            borderRadius: '6px',\n            padding: '10px 12px',\n            zIndex: '60',\n            boxShadow: '0 6px 18px rgba(0,0,0,0.35)',\n            fontFamily: \"'Inter', system-ui, sans-serif\",\n            fontSize: '11px',\n            color: this.theme.tooltip.text,\n            alignItems: 'center',\n        });\n        const keys = Object.keys(levels).sort((a, b) => Number(a) - Number(b));\n        for (const k of keys) {\n            const level = levels[k];\n\n            const cb = document.createElement('input');\n            cb.type = 'checkbox';\n            cb.checked = level.visible !== false;\n            cb.style.accentColor = this.theme.ui.accent;\n            cb.style.cursor = 'pointer';\n\n            const label = document.createElement('span');\n            label.textContent = k;\n            Object.assign(label.style, { fontSize: '11px', color: this.theme.tooltip.text });\n\n            const swatch = this.makeColorSwatch(level.color, (hex) => {\n                this.emit({ levels: { [k]: { visible: cb.checked, color: hex } } } as Partial<DrawingFibStyle>);\n            });\n\n            cb.addEventListener('change', () => {\n                this.emit({ levels: { [k]: { visible: cb.checked, color: level.color } } } as Partial<DrawingFibStyle>);\n            });\n\n            panel.append(cb, label, swatch);\n        }\n        // Position relative to popover container\n        const anchorRect = anchor.getBoundingClientRect();\n        const cRect = this.container.getBoundingClientRect();\n        this.container.appendChild(panel);\n        const panelRect = panel.getBoundingClientRect();\n        let left = anchorRect.left - cRect.left;\n        let top  = anchorRect.bottom - cRect.top + 6;\n        // Clamp inside container\n        left = Math.max(4, Math.min(cRect.width - panelRect.width - 4, left));\n        if (top + panelRect.height > cRect.height - 4) {\n            top = Math.max(4, anchorRect.top - cRect.top - panelRect.height - 6);\n        }\n        panel.style.left = `${left}px`;\n        panel.style.top  = `${top}px`;\n        this.fibPanel = panel;\n    }\n\n    private closeFibPanel(): void {\n        this.fibPanel?.remove();\n        this.fibPanel = null;\n    }\n\n    private makeIconButton(title: string): HTMLDivElement {\n        const btn = document.createElement('div');\n        Object.assign(btn.style, {\n            display:        'flex',\n            alignItems:     'center',\n            justifyContent: 'center',\n            minWidth:       `${SWATCH_PX}px`,\n            height:         `${SWATCH_PX}px`,\n            padding:        '0 4px',\n            borderRadius:   '4px',\n            cursor:         'pointer',\n            border:         `1px solid transparent`,\n            color:          this.theme.tooltip.text,\n            background:     'transparent',\n            fontSize:       '11px',\n            boxSizing:      'border-box',\n        });\n        btn.title = title;\n        btn.addEventListener('mouseenter', () => {\n            if (btn.dataset.active !== '1') btn.style.background = this.theme.indicatorOverlay.dropdownHoverBg;\n        });\n        btn.addEventListener('mouseleave', () => {\n            if (btn.dataset.active !== '1') btn.style.background = 'transparent';\n        });\n        return btn;\n    }\n\n    private markActive(btn: HTMLDivElement): void {\n        btn.dataset.active = '1';\n        btn.style.background = this.theme.ui.accentBg;\n        btn.style.borderColor = this.theme.ui.accent;\n    }\n\n    // ── Apply patch ──────────────────────────────────────────────────────────\n\n    private emit(patch: Partial<AnyDrawingStyle>): void {\n        if (!this.currentDrawing) return;\n        this.onChange(this.currentDrawing.id, patch);\n        this.rebuild();\n    }\n}\n","import type { ChartTheme } from '../core/themes.js';\nimport { observeKeyboard } from './keyboardAware.js';\n\n/**\n * Small flyout that appears below the draft order QTY pill when clicked.\n * Provides −/input/+ controls for editing the lot quantity.\n * Modelled after TradePopover.\n */\nexport class DraftQtyFlyout {\n    readonly el: HTMLDivElement;\n    private theme: ChartTheme;\n    private onCommit: (qty: number) => void;\n    private input: HTMLInputElement;\n    private _min = 1;\n    private _max = 100;\n    private _step = 1;\n    private _intendedTop = 0;\n    private _disposeKbd: () => void = () => {};\n    private onVisibilityChange?: () => void;\n\n    constructor(\n        theme: ChartTheme,\n        onCommit: (qty: number) => void,\n        onVisibilityChange?: () => void,\n    ) {\n        this.theme = theme;\n        this.onCommit = onCommit;\n        this.onVisibilityChange = onVisibilityChange;\n\n        this.el = document.createElement('div');\n        Object.assign(this.el.style, {\n            position:      'fixed',\n            display:       'none',\n            flexDirection: 'row',\n            alignItems:    'center',\n            gap:           '4px',\n            background:    theme.tooltip.background,\n            border:        `1px solid ${theme.axisBorder}`,\n            borderRadius:  '5px',\n            padding:       '5px 7px',\n            zIndex:        '25',\n            boxShadow:     '0 4px 16px rgba(0,0,0,0.3)',\n            fontFamily:    \"'Inter', system-ui, sans-serif\",\n            fontSize:      '13px',\n            color:         theme.tooltip.text,\n            pointerEvents: 'auto',\n        });\n\n        const decBtn = this.makeStepBtn('−', () => this.step(-1));\n        this.input = this.makeInput();\n        const incBtn = this.makeStepBtn('+', () => this.step(+1));\n\n        this.el.append(decBtn, this.input, incBtn);\n\n        // Prevent mousedown inside flyout from leaking to canvas handlers\n        this.el.addEventListener('mousedown', (e) => e.stopPropagation());\n        this.el.addEventListener('touchstart', (e) => e.stopPropagation());\n\n        document.addEventListener('mousedown', this.onDocMouseDown);\n\n        this._disposeKbd = observeKeyboard(this.el, () => this._intendedTop);\n    }\n\n    // ── Public ────────────────────────────────────────────────────────────────\n\n    show(\n        pillX: number,\n        boxBottom: number,\n        currentQty: number,\n        min: number,\n        max: number,\n    ): void {\n        const wasVisible = this.isVisible;\n        this._min  = min;\n        this._max  = max;\n        this._step = min; // minLots doubles as step\n\n        this.input.min   = String(min);\n        this.input.max   = String(max);\n        this.input.step  = String(min);\n        this.input.value = String(currentQty);\n\n        this._intendedTop     = boxBottom + 4;\n        this.el.style.display = 'flex';\n        this.el.style.left    = `${pillX}px`;\n        this.el.style.top     = `${this._intendedTop}px`;\n\n        if (!wasVisible) this.onVisibilityChange?.();\n\n        // Intentionally no auto-focus. On iOS, programmatic .focus() does not\n        // open the keyboard (only a real user gesture does), yet leaves the\n        // input in a \"focused\" state — so a subsequent tap is interpreted as a\n        // no-op and the keyboard still doesn't open. Users primarily adjust qty\n        // with −/+, so opening the keyboard uninvited is bad UX anyway. Let the\n        // user tap the field to open the keyboard naturally.\n    }\n\n    hide(): void {\n        const wasVisible = this.isVisible;\n        this.el.style.display = 'none';\n        if (wasVisible) this.onVisibilityChange?.();\n    }\n\n    get isVisible(): boolean {\n        return this.el.style.display !== 'none';\n    }\n\n    setTheme(theme: ChartTheme): void {\n        this.theme = theme;\n        Object.assign(this.el.style, {\n            background: theme.tooltip.background,\n            border:     `1px solid ${theme.axisBorder}`,\n            color:      theme.tooltip.text,\n        });\n        this.input.style.borderBottom = `1px solid ${theme.axisBorder}`;\n    }\n\n    destroy(): void {\n        document.removeEventListener('mousedown', this.onDocMouseDown);\n        this._disposeKbd();\n    }\n\n    // ── Private ───────────────────────────────────────────────────────────────\n\n    private makeStepBtn(label: string, onClick: () => void): HTMLButtonElement {\n        const btn = document.createElement('button');\n        btn.textContent = label;\n        Object.assign(btn.style, {\n            background:   'transparent',\n            border:       'none',\n            color:        'inherit',\n            cursor:       'pointer',\n            fontSize:     '16px',\n            lineHeight:   '1',\n            padding:      '0 4px',\n            borderRadius: '3px',\n            opacity:      '0.7',\n        });\n        btn.addEventListener('mouseenter', () => { btn.style.opacity = '1'; });\n        btn.addEventListener('mouseleave', () => { btn.style.opacity = '0.7'; });\n        btn.addEventListener('mousedown', (e) => {\n            e.preventDefault(); // keep input focused\n            onClick();\n        });\n        return btn;\n    }\n\n    private makeInput(): HTMLInputElement {\n        const input = document.createElement('input');\n        input.type = 'number';\n        Object.assign(input.style, {\n            width:        '64px',\n            background:   'transparent',\n            border:       'none',\n            borderBottom: `1px solid ${this.theme.axisBorder}`,\n            color:        'inherit',\n            // iOS Safari auto-zooms on focus for inputs <16px and never\n            // restores the zoom on blur — leaving the chart scaled up until\n            // reload. Keep this at 16px to disable that behavior.\n            font:         \"16px 'Inter', system-ui, sans-serif\",\n            outline:      'none',\n            textAlign:    'center',\n            padding:      '1px 2px',\n        });\n\n        input.addEventListener('focus', () => {\n            // Select on user-initiated focus so typing replaces the current value.\n            input.select();\n        });\n\n        input.addEventListener('input', () => {\n            // Sync value to the main box on every valid keystroke\n            this.syncIfValid();\n        });\n\n        input.addEventListener('keydown', (e) => {\n            if (e.key === 'Enter') {\n                e.preventDefault();\n                this.syncIfValid();\n                this.hide();\n            } else if (e.key === 'Escape') {\n                e.preventDefault();\n                this.hide();\n            }\n        });\n\n        input.addEventListener('blur', () => {\n            if (this.isVisible) {\n                this.syncIfValid();\n                this.hide();\n            }\n        });\n\n        return input;\n    }\n\n    private step(direction: 1 | -1): void {\n        const current = parseFloat(this.input.value) || this._min;\n        const next = Math.round((current + direction * this._step) * 1e10) / 1e10;\n        this.input.value = String(Math.min(this._max, Math.max(this._min, next)));\n        // Don't re-focus the input here — if the user is tapping −/+, they've\n        // deliberately chosen buttons over the keyboard. Focusing would open it.\n        // The mousedown handler on the step button already calls preventDefault\n        // to preserve any existing focus when the user had been typing.\n        this.syncIfValid();\n    }\n\n    private syncIfValid(): void {\n        const val = parseFloat(this.input.value);\n        if (!isNaN(val) && val >= this._min && val <= this._max) {\n            this.onCommit(val);\n        }\n    }\n\n    private onDocMouseDown = (e: MouseEvent): void => {\n        if (this.isVisible && !this.el.contains(e.target as Node)) {\n            this.syncIfValid();\n            this.hide();\n        }\n    };\n}\n","import type { ChartTheme } from '../core/themes.js';\nimport { ICON_CLOSE } from './icons.js';\nimport { observeKeyboardTransform } from './keyboardAware.js';\n\nconst INITIAL_LIMIT = 50;\nconst SEARCH_LIMIT  = 20;\n\nexport class IsinPickerModal {\n    /** Backdrop element — append this to document.body */\n    readonly el: HTMLDivElement;\n\n    private theme: ChartTheme;\n    private panel: HTMLDivElement;\n    private listEl: HTMLDivElement;\n    private searchInput: HTMLInputElement;\n    private onSelect: (isin: string) => void;\n\n    private isins: string[]        = [];\n    private currentSymbol: string  = '';\n\n    private escHandler: ((e: KeyboardEvent) => void) | null = null;\n    private disposeKbd: () => void = () => {};\n    private onVisibilityChange?: () => void;\n\n    constructor(\n        theme: ChartTheme,\n        onSelect: (isin: string) => void,\n        onVisibilityChange?: () => void,\n    ) {\n        this.theme    = theme;\n        this.onSelect = onSelect;\n        this.onVisibilityChange = onVisibilityChange;\n\n        // ── Backdrop ──────────────────────────────────────────────────────────\n        this.el = document.createElement('div');\n        Object.assign(this.el.style, {\n            position:       'fixed',\n            inset:          '0',\n            background:     'rgba(0,0,0,0.5)',\n            display:        'none',\n            alignItems:     'center',\n            justifyContent: 'center',\n            zIndex:         '1000',\n        });\n        this.el.addEventListener('mousedown', (e) => {\n            if (e.target === this.el) this.hide();\n        });\n\n        // ── Panel ─────────────────────────────────────────────────────────────\n        this.panel = document.createElement('div');\n        Object.assign(this.panel.style, {\n            display:       'flex',\n            flexDirection: 'column',\n            width:         '360px',\n            maxHeight:     '520px',\n            background:    theme.tooltip.background,\n            border:        `1px solid ${theme.axisBorder}`,\n            borderRadius:  '6px',\n            boxShadow:     '0 8px 32px rgba(0,0,0,0.45)',\n            fontFamily:    \"'Inter', system-ui, sans-serif\",\n            fontSize:      '12px',\n            overflow:      'hidden',\n        });\n        this.panel.addEventListener('mousedown', (e) => e.stopPropagation());\n        this.el.appendChild(this.panel);\n\n        // ── Header ────────────────────────────────────────────────────────────\n        const header = document.createElement('div');\n        Object.assign(header.style, {\n            display:        'flex',\n            alignItems:     'center',\n            justifyContent: 'space-between',\n            padding:        '10px 14px',\n            borderBottom:   `1px solid ${theme.axisBorder}`,\n            flexShrink:     '0',\n        });\n\n        const titleEl = document.createElement('span');\n        titleEl.textContent = 'Select Symbol';\n        Object.assign(titleEl.style, {\n            color:      theme.tooltip.text,\n            fontWeight: '600',\n            fontSize:   '13px',\n        });\n\n        const closeBtn = document.createElement('span');\n        closeBtn.innerHTML = ICON_CLOSE;\n        Object.assign(closeBtn.style, {\n            display:    'inline-flex',\n            alignItems: 'center',\n            color:      theme.axisText,\n            cursor:     'pointer',\n        });\n        closeBtn.addEventListener('mouseenter', () => { closeBtn.style.color = theme.tooltip.text; });\n        closeBtn.addEventListener('mouseleave', () => { closeBtn.style.color = theme.axisText; });\n        closeBtn.addEventListener('click', () => this.hide());\n\n        header.appendChild(titleEl);\n        header.appendChild(closeBtn);\n        this.panel.appendChild(header);\n\n        // ── Search input ──────────────────────────────────────────────────────\n        const searchWrap = document.createElement('div');\n        Object.assign(searchWrap.style, {\n            padding:      '8px 14px',\n            borderBottom: `1px solid ${theme.axisBorder}`,\n            flexShrink:   '0',\n        });\n\n        this.searchInput = document.createElement('input');\n        this.searchInput.type        = 'text';\n        this.searchInput.placeholder = 'Search symbols…';\n        Object.assign(this.searchInput.style, {\n            width:           '100%',\n            boxSizing:       'border-box',\n            background:      'transparent',\n            border:          `1px solid ${theme.axisBorder}`,\n            borderRadius:    '4px',\n            color:           theme.tooltip.text,\n            // iOS Safari auto-zooms on focus for inputs <16px without ever\n            // restoring the zoom — keep at 16px to disable that behavior.\n            fontSize:        '16px',\n            padding:         '5px 8px',\n            outline:         'none',\n        });\n        this.searchInput.addEventListener('input', () => this.renderList());\n\n        searchWrap.appendChild(this.searchInput);\n        this.panel.appendChild(searchWrap);\n\n        // ── List ──────────────────────────────────────────────────────────────\n        this.listEl = document.createElement('div');\n        Object.assign(this.listEl.style, {\n            overflowY:       'auto',\n            flex:            '1',\n            scrollbarWidth:  'thin',\n            scrollbarColor:  'rgba(120,130,150,0.35) transparent',\n        });\n        this.panel.appendChild(this.listEl);\n\n        this.disposeKbd = observeKeyboardTransform(this.panel);\n    }\n\n    // ── Public API ────────────────────────────────────────────────────────────\n\n    show(isins: string[], currentSymbol: string): void {\n        const wasVisible = this.isVisible;\n        this.isins         = isins;\n        this.currentSymbol = currentSymbol;\n        this.searchInput.value = '';\n        this.renderList();\n        this.el.style.display = 'flex';\n        // Focus search after paint so the input is visible\n        requestAnimationFrame(() => this.searchInput.focus({ preventScroll: true }));\n\n        // Escape key to close\n        this.escHandler = (e: KeyboardEvent) => {\n            if (e.key === 'Escape') this.hide();\n        };\n        document.addEventListener('keydown', this.escHandler);\n        if (!wasVisible) this.onVisibilityChange?.();\n    }\n\n    hide(): void {\n        const wasVisible = this.isVisible;\n        this.el.style.display = 'none';\n        if (this.escHandler) {\n            document.removeEventListener('keydown', this.escHandler);\n            this.escHandler = null;\n        }\n        if (wasVisible) this.onVisibilityChange?.();\n    }\n\n    get isVisible(): boolean {\n        return this.el.style.display !== 'none';\n    }\n\n    setCurrentSymbol(symbol: string): void {\n        this.currentSymbol = symbol;\n        // Refresh highlight if modal is open\n        if (this.el.style.display !== 'none') {\n            this.renderList();\n        }\n    }\n\n    setIsins(isins: string[]): void {\n        this.isins = isins;\n    }\n\n    setTheme(theme: ChartTheme): void {\n        this.theme = theme;\n        Object.assign(this.panel.style, {\n            background: theme.tooltip.background,\n            border:     `1px solid ${theme.axisBorder}`,\n        });\n    }\n\n    destroy(): void {\n        if (this.escHandler) document.removeEventListener('keydown', this.escHandler);\n        this.disposeKbd();\n        this.el.remove();\n    }\n\n    // ── Private helpers ───────────────────────────────────────────────────────\n\n    private sortWithCurrentFirst(items: string[]): string[] {\n        if (!this.currentSymbol) return items;\n        const idx = items.indexOf(this.currentSymbol);\n        if (idx <= 0) return items;\n        const sorted = items.slice();\n        sorted.splice(idx, 1);\n        sorted.unshift(this.currentSymbol);\n        return sorted;\n    }\n\n    private renderList(): void {\n        const query   = this.searchInput.value.trim().toLowerCase();\n        const filtered = this.sortWithCurrentFirst(query\n            ? this.isins.filter(s => s.toLowerCase().includes(query)).slice(0, SEARCH_LIMIT)\n            : this.isins.slice(0, INITIAL_LIMIT));\n\n        this.listEl.innerHTML = '';\n\n        if (filtered.length === 0) {\n            const empty = document.createElement('div');\n            empty.textContent = 'No symbols found';\n            Object.assign(empty.style, {\n                padding:   '16px 14px',\n                color:     this.theme.axisText,\n                textAlign: 'center',\n            });\n            this.listEl.appendChild(empty);\n            return;\n        }\n\n        for (const isin of filtered) {\n            const row = document.createElement('div');\n            const isActive = isin === this.currentSymbol;\n            Object.assign(row.style, {\n                padding:         '8px 14px',\n                cursor:          'pointer',\n                color:           isActive ? this.theme.ui.accentText : this.theme.tooltip.text,\n                background:      isActive ? this.theme.ui.accentBg   : 'transparent',\n                fontWeight:      isActive ? '600' : '400',\n                borderLeft:      isActive ? `2px solid ${this.theme.ui.accent}` : '2px solid transparent',\n                boxSizing:       'border-box',\n                userSelect:      'none',\n            });\n\n            row.textContent = isin;\n\n            row.addEventListener('mouseenter', () => {\n                if (isin !== this.currentSymbol) {\n                    row.style.background = this.theme.ui.accentBg;\n                }\n            });\n            row.addEventListener('mouseleave', () => {\n                if (isin !== this.currentSymbol) {\n                    row.style.background = 'transparent';\n                }\n            });\n            row.addEventListener('click', () => {\n                this.onSelect(isin);\n                this.hide();\n            });\n\n            this.listEl.appendChild(row);\n        }\n    }\n}\n","import type { AnyLevel, TradeLevelType } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport type { PriceRange } from '../core/types.js';\n\n/**\n * Manages the drag lifecycle for trade level lines and bracket (SL/TP) lines.\n *\n * This is NOT a standalone DOM event listener — it is a stateful helper driven\n * entirely by ChartEngine's existing mouse event handlers.\n *\n * Usage:\n *   mousedown → startDrag(...)\n *   mousemove → onMouseMove(...)  → returns live price for floating label\n *   mouseup   → endDrag()        → returns final payload for event emission\n */\nexport class TradeDragHandler {\n    private _active           = false;\n    private _isDraggingBracket = false;\n\n    // Main line drag state\n    private _level:        AnyLevel | null = null;\n    private _startPrice:   number = 0;\n    private _currentPrice: number = 0;\n    // Pixel offset between click Y and the level's rendered Y at drag start.\n    // Why: the drag hit-strip is 8 px tall; without this, the cursor-to-price\n    // mapping would snap the level to wherever the cursor is instead of\n    // preserving the grab point. Also immunises the drag from any priceRange\n    // animation (lerp) that happens between drag-start and first mousemove.\n    private _pixelOffset:  number = 0;\n    // Entry-price constraint bounds (applied when SL/TP exist on the level)\n    private _mainMinPrice: number = -Infinity;\n    private _mainMaxPrice: number = +Infinity;\n\n    // Bracket drag state\n    private _bracketType:         'stopLoss' | 'takeProfit' | null = null;\n    private _bracketStartPrice:   number = 0;\n    private _bracketCurrentPrice: number = 0;\n    private _bracketPixelOffset:  number = 0;\n\n    // Bracket constraint state (populated on startBracketDrag)\n    private _bracketParentPrice:   number = 0;\n    private _bracketParentSide:    'buy' | 'sell' = 'buy';\n    private _bracketMarketPrice:   number = 0;   // current market price at drag start\n\n    // Follow-brackets mode: when entry drag starts on an editable pending/draft/entry order,\n    // the brackets translate by the same delta as entry instead of constraining it.\n    private _followBrackets:  boolean = false;\n    private _slStartPrice:    number | undefined;\n    private _tpStartPrice:    number | undefined;\n    private _derivedSLPrice:  number | undefined;\n    private _derivedTPPrice:  number | undefined;\n\n    /**\n     * Starts dragging a main level line.\n     * Pass `slPrice` / `tpPrice` / `side` to constrain the drag between SL and TP\n     * (used for ES/EL entry orders where the entry price must stay between brackets).\n     * When `followBrackets` is true, SL/TP translate with entry by the same price delta\n     * instead of acting as entry-clamp bounds.\n     */\n    startDrag(\n        level:           AnyLevel,\n        clickY:          number,\n        levelPixelY:     number,\n        startPrice:      number,\n        slPrice?:        number,\n        tpPrice?:        number,\n        side?:           'buy' | 'sell',\n        marketPrice?:    number,\n        orderType?:      'limit' | 'stop' | 'market',\n        followBrackets?: boolean,\n    ): void {\n        this._active            = true;\n        this._isDraggingBracket = false;\n        this._level             = level;\n        this._pixelOffset       = clickY - levelPixelY;\n        this._startPrice        = startPrice;\n        this._currentPrice      = startPrice;\n        this._bracketType       = null;\n\n        this._followBrackets    = followBrackets === true;\n        this._slStartPrice      = slPrice;\n        this._tpStartPrice      = tpPrice;\n        this._derivedSLPrice    = slPrice;\n        this._derivedTPPrice    = tpPrice;\n\n        if (this._followBrackets) {\n            // Brackets move with entry, so they don't bound entry's movement.\n            this._mainMinPrice = -Infinity;\n            this._mainMaxPrice = +Infinity;\n        } else if (slPrice !== undefined || tpPrice !== undefined) {\n            // Legacy constraint mode: entry must stay between SL and TP.\n            const s = side ?? 'buy';\n            if (s === 'buy') {\n                this._mainMinPrice = slPrice  ?? -Infinity;\n                this._mainMaxPrice = tpPrice  ?? +Infinity;\n            } else {\n                this._mainMinPrice = tpPrice  ?? -Infinity;\n                this._mainMaxPrice = slPrice  ?? +Infinity;\n            }\n        } else {\n            this._mainMinPrice = -Infinity;\n            this._mainMaxPrice = +Infinity;\n        }\n\n        // Market-side constraint for pending order types (not applicable to market orders)\n        if (marketPrice && marketPrice > 0 && orderType && orderType !== 'market' && side) {\n            const mustBeBelowMarket =\n                (side === 'buy'  && orderType === 'limit') ||\n                (side === 'sell' && orderType === 'stop');\n            if (mustBeBelowMarket) {\n                this._mainMaxPrice = Math.min(this._mainMaxPrice, marketPrice);\n            } else {\n                this._mainMinPrice = Math.max(this._mainMinPrice, marketPrice);\n            }\n        }\n    }\n\n    /**\n     * Starts dragging a bracket (SL/TP) line.\n     * @param parentLevel  Parent level\n     * @param bracketType  'stopLoss' | 'takeProfit'\n     * @param startPrice   Current bracket price\n     */\n    startBracketDrag(\n        parentLevel:         AnyLevel,\n        bracketType:         'stopLoss' | 'takeProfit',\n        startPrice:          number,\n        clickY:              number,\n        bracketPixelY:       number,\n        currentMarketPrice:  number = 0,\n        parentPriceOverride?: number,\n    ): void {\n        this._active               = true;\n        this._isDraggingBracket    = true;\n        this._level                = parentLevel;\n        this._bracketType          = bracketType;\n        this._bracketStartPrice    = startPrice;\n        this._bracketCurrentPrice  = startPrice;\n        this._bracketPixelOffset   = clickY - bracketPixelY;\n        this._bracketParentPrice   = parentPriceOverride ?? parentLevel.price;\n        this._bracketParentSide    = (parentLevel as { side?: 'buy' | 'sell' }).side ?? 'buy';\n        this._bracketMarketPrice   = currentMarketPrice;\n    }\n\n    /**\n     * Called on every mousemove during an active drag.\n     * Returns the live price (main or bracket) for the floating label, or null if not dragging.\n     */\n    onMouseMove(\n        currentY:   number,\n        scale:      ScaleManager,\n        priceRange: PriceRange,\n        priceH:     number,\n    ): {\n        newPrice:         number;\n        label:            string;\n        isBracket:        boolean;\n        derivedSLPrice?:  number;\n        derivedTPPrice?:  number;\n    } | null {\n        if (!this._active || !this._level) return null;\n\n        if (this._isDraggingBracket && this._bracketType !== null) {\n            const effectiveY = currentY - this._bracketPixelOffset;\n            const rawPrice = scale.pixelToPrice(effectiveY, priceRange, priceH);\n            const clampedPrice = this._clampBracketPrice(rawPrice, this._bracketType, this._bracketParentPrice, this._bracketParentSide, this._bracketMarketPrice);\n            this._bracketCurrentPrice = clampedPrice;\n            return {\n                newPrice:  clampedPrice,\n                label:     `${this._level.label}:${this._bracketType}`,\n                isBracket: true,\n            };\n        }\n\n        const effectiveY = currentY - this._pixelOffset;\n        const rawPrice = scale.pixelToPrice(effectiveY, priceRange, priceH);\n        // Clamp to SL/TP bounds when they were provided at drag start\n        const constrained = Math.max(this._mainMinPrice, Math.min(this._mainMaxPrice, rawPrice));\n        this._currentPrice = constrained;\n\n        if (this._followBrackets) {\n            const delta = constrained - this._startPrice;\n            this._derivedSLPrice = this._slStartPrice !== undefined ? this._slStartPrice + delta : undefined;\n            this._derivedTPPrice = this._tpStartPrice !== undefined ? this._tpStartPrice + delta : undefined;\n            return {\n                newPrice:       constrained,\n                label:          this._level.label,\n                isBracket:      false,\n                derivedSLPrice: this._derivedSLPrice,\n                derivedTPPrice: this._derivedTPPrice,\n            };\n        }\n\n        return {\n            newPrice:  constrained,\n            label:     this._level.label,\n            isBracket: false,\n        };\n    }\n\n    /**\n     * Called on mouseup to finalise the drag.\n     * Returns the payload for event emission, or null if not active.\n     */\n    endDrag(): {\n        label:           string;\n        type:            TradeLevelType;\n        newPrice:        number;\n        /** Price when the drag started — use this as oldPrice when recording pending changes. */\n        startPrice:      number;\n        data:            unknown;\n        bracketType?:    'stopLoss' | 'takeProfit';\n        /** Final derived SL price when follow-brackets was active (main-line drag only). */\n        derivedSLPrice?: number;\n        /** Final derived TP price when follow-brackets was active (main-line drag only). */\n        derivedTPPrice?: number;\n        /** SL price captured at drag start (use as oldPrice for the SL pending change). */\n        slStartPrice?:   number;\n        /** TP price captured at drag start (use as oldPrice for the TP pending change). */\n        tpStartPrice?:   number;\n    } | null {\n        if (!this._active || !this._level) return null;\n\n        const level = this._level;\n        let result: ReturnType<TradeDragHandler['endDrag']>;\n\n        if (this._isDraggingBracket && this._bracketType !== null) {\n            result = {\n                label:       level.label,\n                type:        level.type,\n                newPrice:    this._bracketCurrentPrice,\n                startPrice:  this._bracketStartPrice,\n                data:        level.data,\n                bracketType: this._bracketType,\n            };\n        } else if (this._followBrackets) {\n            result = {\n                label:          level.label,\n                type:           level.type,\n                newPrice:       this._currentPrice,\n                startPrice:     this._startPrice,\n                data:           level.data,\n                derivedSLPrice: this._derivedSLPrice,\n                derivedTPPrice: this._derivedTPPrice,\n                slStartPrice:   this._slStartPrice,\n                tpStartPrice:   this._tpStartPrice,\n            };\n        } else {\n            result = {\n                label:      level.label,\n                type:       level.type,\n                newPrice:   this._currentPrice,\n                startPrice: this._startPrice,\n                data:       level.data,\n            };\n        }\n\n        this._reset();\n        return result;\n    }\n\n    /** Cancels any in-progress drag without emitting. */\n    cancelDrag(): void {\n        this._reset();\n    }\n\n    get active(): boolean {\n        return this._active;\n    }\n\n    /** The label of the level being dragged (or `label:bracketType` for bracket drag). */\n    get dragLabel(): string | null {\n        if (!this._active || !this._level) return null;\n        if (this._isDraggingBracket && this._bracketType) {\n            return `${this._level.label}:${this._bracketType}`;\n        }\n        return this._level.label;\n    }\n\n    /** The live price during an active drag (for use in renderTradeLayer). */\n    get currentPrice(): number | null {\n        if (!this._active) return null;\n        return this._isDraggingBracket\n            ? this._bracketCurrentPrice\n            : this._currentPrice;\n    }\n\n    // ── Private helpers ────────────────────────────────────────────────────────\n\n    /**\n     * Returns whether `price` is a valid placement for a bracket.\n     *\n     * The boundary is the stricter of `parentPrice` (entry) and\n     * `currentMarketPrice` (live price), so neither is crossed:\n     *\n     *   Buy  SL → must be below min(entry, market)\n     *   Buy  TP → must be above max(entry, market)\n     *   Sell SL → must be above max(entry, market)\n     *   Sell TP → must be below min(entry, market)\n     *\n     * Pass `currentMarketPrice = 0` (default) to validate against entry only.\n     */\n    static isBracketPriceValid(\n        price:               number,\n        bracketType:         'stopLoss' | 'takeProfit',\n        parentPrice:         number,\n        parentSide:          'buy' | 'sell',\n        currentMarketPrice:  number = 0,\n    ): boolean {\n        const ref = currentMarketPrice > 0\n            ? (parentSide === 'buy'\n                ? (bracketType === 'stopLoss'\n                    ? Math.min(parentPrice, currentMarketPrice)   // buy SL: below both\n                    : Math.max(parentPrice, currentMarketPrice))  // buy TP: above both\n                : (bracketType === 'stopLoss'\n                    ? Math.max(parentPrice, currentMarketPrice)   // sell SL: above both\n                    : Math.min(parentPrice, currentMarketPrice))) // sell TP: below both\n            : parentPrice;\n\n        if (parentSide === 'buy') {\n            return bracketType === 'stopLoss' ? price < ref : price > ref;\n        }\n        return bracketType === 'stopLoss' ? price > ref : price < ref;\n    }\n\n    /**\n     * Clamps `rawPrice` to the valid side of the boundary price.\n     * Snaps to the boundary itself when the limit is hit, giving visual\n     * feedback without allowing the line to cross the constraint.\n     */\n    private _clampBracketPrice(\n        rawPrice:           number,\n        bracketType:        'stopLoss' | 'takeProfit',\n        parentPrice:        number,\n        parentSide:         'buy' | 'sell',\n        currentMarketPrice: number = 0,\n    ): number {\n        if (TradeDragHandler.isBracketPriceValid(rawPrice, bracketType, parentPrice, parentSide, currentMarketPrice)) {\n            return rawPrice;\n        }\n        // Snap to the boundary so the line sticks at the limit visually\n        if (currentMarketPrice > 0) {\n            return parentSide === 'buy'\n                ? (bracketType === 'stopLoss'\n                    ? Math.min(parentPrice, currentMarketPrice)\n                    : Math.max(parentPrice, currentMarketPrice))\n                : (bracketType === 'stopLoss'\n                    ? Math.max(parentPrice, currentMarketPrice)\n                    : Math.min(parentPrice, currentMarketPrice));\n        }\n        return parentPrice;\n    }\n\n    private _reset(): void {\n        this._active              = false;\n        this._isDraggingBracket   = false;\n        this._level               = null;\n        this._bracketType         = null;\n        this._currentPrice        = 0;\n        this._pixelOffset         = 0;\n        this._mainMinPrice        = -Infinity;\n        this._mainMaxPrice        = +Infinity;\n        this._bracketStartPrice   = 0;\n        this._bracketCurrentPrice = 0;\n        this._bracketPixelOffset  = 0;\n        this._bracketParentPrice  = 0;\n        this._bracketParentSide    = 'buy';\n        this._bracketMarketPrice   = 0;\n        this._followBrackets       = false;\n        this._slStartPrice         = undefined;\n        this._tpStartPrice         = undefined;\n        this._derivedSLPrice       = undefined;\n        this._derivedTPPrice       = undefined;\n    }\n}\n","import type { OHLCVBar } from '../core/types.js';\n\nexport type PriceSource = 'open' | 'high' | 'low' | 'close';\n\nexport function getSource(bar: OHLCVBar, source: PriceSource): number {\n    return bar[source];\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport { getSource, type PriceSource } from './sourceField.js';\n\nexport class SMA implements IIndicator {\n  readonly name: string;\n  readonly color: string;\n\n  constructor(\n    private readonly period: number,\n    color = '#F5A623',\n    name = 'MA',\n    private readonly source: PriceSource = 'close',\n  ) {\n    this.name = name;\n    this.color = color;\n  }\n\n  compute(data: OHLCVBar[]): IndicatorResult[] {\n    return data.map((_, i) => {\n      if (i < this.period - 1) return { index: i, value: null };\n      let sum = 0;\n      for (let j = i - this.period + 1; j <= i; j++) sum += getSource(data[j], this.source);\n      return { index: i, value: sum / this.period };\n    });\n  }\n\n  render(\n    ctx: CanvasRenderingContext2D,\n    results: IndicatorResult[],\n    scale: ScaleManager,\n    viewport: Viewport,\n    chartHeight: number,\n  ): void {\n    const priceRange = getPriceRangeFromCtx(ctx);\n    if (!priceRange) return;\n\n    ctx.beginPath();\n    ctx.strokeStyle = this.color;\n    ctx.lineWidth = 1.5;\n    ctx.lineJoin = 'round';\n\n    let started = false;\n    const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n\n    for (const r of results) {\n      if (r.value === null) { started = false; continue; }\n      const x = scale.xToPixel(r.index, viewport, chartWidth);\n      const y = scale.yToPixel(r.value, priceRange, chartHeight);\n      started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n    }\n\n    ctx.stroke();\n  }\n}\n\n// Helper — ChartEngine injects priceRange via canvas dataset\nfunction getPriceRangeFromCtx(ctx: CanvasRenderingContext2D) {\n  const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n  return canvas._priceRange ?? null;\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport { getSource, type PriceSource } from './sourceField.js';\n\nexport class EMA implements IIndicator {\n  readonly name: string;\n  readonly color: string;\n\n  constructor(\n    private readonly period: number,\n    color = '#9B59B6',\n    name = 'EMA',\n    private readonly source: PriceSource = 'close',\n  ) {\n    this.name = name;\n    this.color = color;\n  }\n\n  compute(data: OHLCVBar[]): IndicatorResult[] {\n    const k = 2 / (this.period + 1);\n    const results: IndicatorResult[] = [];\n    let ema: number | null = null;\n\n    for (let i = 0; i < data.length; i++) {\n      if (i < this.period - 1) {\n        results.push({ index: i, value: null });\n        continue;\n      }\n      if (ema === null) {\n        // Seed with SMA\n        let sum = 0;\n        for (let j = 0; j < this.period; j++) sum += getSource(data[i - j], this.source);\n        ema = sum / this.period;\n      } else {\n        ema = getSource(data[i], this.source) * k + ema * (1 - k);\n      }\n      results.push({ index: i, value: ema });\n    }\n\n    return results;\n  }\n\n  render(\n    ctx: CanvasRenderingContext2D,\n    results: IndicatorResult[],\n    scale: ScaleManager,\n    viewport: Viewport,\n    chartHeight: number,\n  ): void {\n    const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n    const priceRange = canvas._priceRange;\n    if (!priceRange) return;\n\n    ctx.beginPath();\n    ctx.strokeStyle = this.color;\n    ctx.lineWidth = 1.5;\n    ctx.lineJoin = 'round';\n\n    let started = false;\n    const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n\n    for (const r of results) {\n      if (r.value === null) { started = false; continue; }\n      const x = scale.xToPixel(r.index, viewport, chartWidth);\n      const y = scale.yToPixel(r.value, priceRange, chartHeight);\n      started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n    }\n\n    ctx.stroke();\n  }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport { getSource, type PriceSource } from './sourceField.js';\n\nexport class WMA implements IIndicator {\n  readonly name: string;\n  readonly color: string;\n\n  constructor(\n    private readonly period = 20,\n    color = '#e91e63',\n    name = 'WMA',\n    private readonly source: PriceSource = 'close',\n  ) {\n    this.name = name;\n    this.color = color;\n  }\n\n  compute(data: OHLCVBar[]): IndicatorResult[] {\n    const denominator = (this.period * (this.period + 1)) / 2;\n    const results: IndicatorResult[] = [];\n\n    for (let i = 0; i < data.length; i++) {\n      if (i < this.period - 1) {\n        results.push({ index: i, value: null });\n        continue;\n      }\n      let wma = 0;\n      for (let j = 0; j < this.period; j++) {\n        // j=0 is oldest, j=period-1 is newest; weight = j+1\n        wma += getSource(data[i - (this.period - 1 - j)], this.source) * (j + 1);\n      }\n      results.push({ index: i, value: wma / denominator });\n    }\n\n    return results;\n  }\n\n  render(\n    ctx: CanvasRenderingContext2D,\n    results: IndicatorResult[],\n    scale: ScaleManager,\n    viewport: Viewport,\n    chartHeight: number,\n  ): void {\n    const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n    const priceRange = canvas._priceRange;\n    if (!priceRange) return;\n\n    const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n\n    ctx.beginPath();\n    ctx.strokeStyle = this.color;\n    ctx.lineWidth = 1.5;\n    ctx.lineJoin = 'round';\n\n    let started = false;\n    for (const r of results) {\n      if (r.value === null) { started = false; continue; }\n      const x = scale.xToPixel(r.index, viewport, chartWidth);\n      const y = scale.yToPixel(r.value, priceRange, chartHeight);\n      started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n    }\n\n    ctx.stroke();\n  }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport { getSource, type PriceSource } from './sourceField.js';\n\nfunction computeWMA(data: number[], period: number): (number | null)[] {\n  const denominator = (period * (period + 1)) / 2;\n  const results: (number | null)[] = [];\n\n  for (let i = 0; i < data.length; i++) {\n    if (i < period - 1) {\n      results.push(null);\n      continue;\n    }\n    let wma = 0;\n    for (let j = 0; j < period; j++) {\n      // j=0 is oldest, j=period-1 is newest; weight = j+1\n      wma += data[i - (period - 1 - j)] * (j + 1);\n    }\n    results.push(wma / denominator);\n  }\n\n  return results;\n}\n\nexport class HMA implements IIndicator {\n  readonly name: string;\n  readonly color: string;\n\n  constructor(\n    private readonly period = 20,\n    color = '#00bcd4',\n    name = 'HMA',\n    private readonly source: PriceSource = 'close',\n  ) {\n    this.name = name;\n    this.color = color;\n  }\n\n  compute(data: OHLCVBar[]): IndicatorResult[] {\n    const closes = data.map((b) => getSource(b, this.source));\n    const halfPeriod = Math.floor(this.period / 2);\n    const sqrtPeriod = Math.floor(Math.sqrt(this.period));\n\n    // Step 1: WMA(n/2) and WMA(n) on closes\n    const wmaHalf = computeWMA(closes, halfPeriod);\n    const wmaFull = computeWMA(closes, this.period);\n\n    // Step 2: diff[i] = 2 * wmaHalf[i] - wmaFull[i]\n    const diff: (number | null)[] = wmaHalf.map((half, i) => {\n      const full = wmaFull[i];\n      if (half === null || full === null) return null;\n      return 2 * half - full;\n    });\n\n    // Step 3: WMA(sqrt(n)) on diff, treating nulls as 0 for computation\n    // but only emit values from indices where diff was not null\n    const diffForWma = diff.map((v) => (v === null ? 0 : v));\n    const hmaRaw = computeWMA(diffForWma, sqrtPeriod);\n\n    return data.map((_, i) => {\n      // Only valid if the diff at the start of the window was not null\n      const windowStart = i - sqrtPeriod + 1;\n      if (windowStart < 0) return { index: i, value: null };\n      // Check that all diff values in the window were valid\n      const allDiffValid = diff[windowStart] !== null && diff[i] !== null;\n      if (!allDiffValid || hmaRaw[i] === null) return { index: i, value: null };\n      return { index: i, value: hmaRaw[i] };\n    });\n  }\n\n  render(\n    ctx: CanvasRenderingContext2D,\n    results: IndicatorResult[],\n    scale: ScaleManager,\n    viewport: Viewport,\n    chartHeight: number,\n  ): void {\n    const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n    const priceRange = canvas._priceRange;\n    if (!priceRange) return;\n\n    const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n\n    ctx.beginPath();\n    ctx.strokeStyle = this.color;\n    ctx.lineWidth = 1.5;\n    ctx.lineJoin = 'round';\n\n    let started = false;\n    for (const r of results) {\n      if (r.value === null) { started = false; continue; }\n      const x = scale.xToPixel(r.index, viewport, chartWidth);\n      const y = scale.yToPixel(r.value, priceRange, chartHeight);\n      started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n    }\n\n    ctx.stroke();\n  }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport { getSource, type PriceSource } from './sourceField.js';\n\nconst RIBBON_PERIODS = [5, 10, 20, 50, 100] as const;\nconst RIBBON_COLORS = ['#ff6b6b', '#ffd93d', '#6bcb77', '#4d96ff', '#c77dff'] as const;\n\nexport class MARibbon implements IIndicator {\n  readonly name = 'MARibbon';\n  readonly color: string;\n\n  constructor(\n    color = '#ffcc80',\n    private readonly source: PriceSource = 'close',\n  ) {\n    this.color = color;\n  }\n\n  compute(data: OHLCVBar[]): IndicatorResult[] {\n    const sma = (endIndex: number, period: number): number | null => {\n      if (endIndex < period - 1) return null;\n      let sum = 0;\n      for (let j = endIndex - period + 1; j <= endIndex; j++) sum += getSource(data[j], this.source);\n      return sum / period;\n    };\n\n    return data.map((_, i) => ({\n      index: i,\n      value: sma(i, 5),       // SMA5\n      upper: sma(i, 10),      // SMA10\n      lower: sma(i, 20),      // SMA20\n      signal: sma(i, 50),     // SMA50\n      histogram: sma(i, 100), // SMA100\n    }));\n  }\n\n  render(\n    ctx: CanvasRenderingContext2D,\n    results: IndicatorResult[],\n    scale: ScaleManager,\n    viewport: Viewport,\n    chartHeight: number,\n  ): void {\n    const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n    const priceRange = canvas._priceRange;\n    if (!priceRange) return;\n\n    const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n    ctx.lineWidth = 1;\n    ctx.lineJoin = 'round';\n\n    type ValueKey = 'value' | 'upper' | 'lower' | 'signal' | 'histogram';\n    const keys: ValueKey[] = ['value', 'upper', 'lower', 'signal', 'histogram'];\n\n    for (let li = 0; li < RIBBON_PERIODS.length; li++) {\n      const key = keys[li];\n      const lineColor = RIBBON_COLORS[li];\n\n      ctx.beginPath();\n      ctx.strokeStyle = lineColor;\n      let started = false;\n\n      for (const r of results) {\n        const val = r[key];\n        if (val == null) { started = false; continue; }\n        const x = scale.xToPixel(r.index, viewport, chartWidth);\n        const y = scale.yToPixel(val, priceRange, chartHeight);\n        started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n      }\n      ctx.stroke();\n    }\n\n  }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport { getSource, type PriceSource } from './sourceField.js';\n\nexport class BollingerBands implements IIndicator {\n  readonly name: string;\n  readonly color: string;\n\n  constructor(\n    private readonly period = 20,\n    private readonly stdDevMultiplier = 2,\n    color = '#3B82F6',\n    name = 'BB',\n    private readonly source: PriceSource = 'close',\n  ) {\n    this.name = name;\n    this.color = color;\n  }\n\n  compute(data: OHLCVBar[]): IndicatorResult[] {\n    return data.map((_, i) => {\n      if (i < this.period - 1) return { index: i, value: null, upper: null, lower: null };\n\n      const slice = data.slice(i - this.period + 1, i + 1).map((b) => getSource(b, this.source));\n      const mean = slice.reduce((s, v) => s + v, 0) / this.period;\n      const variance = slice.reduce((s, v) => s + (v - mean) ** 2, 0) / this.period;\n      const std = Math.sqrt(variance);\n\n      return {\n        index: i,\n        value: mean,\n        upper: mean + std * this.stdDevMultiplier,\n        lower: mean - std * this.stdDevMultiplier,\n      };\n    });\n  }\n\n  render(\n    ctx: CanvasRenderingContext2D,\n    results: IndicatorResult[],\n    scale: ScaleManager,\n    viewport: Viewport,\n    chartHeight: number,\n  ): void {\n    const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n    const priceRange = canvas._priceRange;\n    if (!priceRange) return;\n\n    const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n    ctx.lineWidth = 1;\n    ctx.lineJoin = 'round';\n\n    const drawLine = (getValue: (r: IndicatorResult) => number | null | undefined, dash = false) => {\n      if (dash) ctx.setLineDash([4, 3]);\n      ctx.beginPath();\n      let started = false;\n      for (const r of results) {\n        const val = getValue(r);\n        if (val == null) { started = false; continue; }\n        const x = scale.xToPixel(r.index, viewport, chartWidth);\n        const y = scale.yToPixel(val, priceRange, chartHeight);\n        started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n      }\n      ctx.stroke();\n      if (dash) ctx.setLineDash([]);\n    };\n\n    ctx.strokeStyle = this.color;\n    drawLine((r) => r.value);          // Middle band (SMA)\n\n    ctx.strokeStyle = `${this.color}99`;\n    drawLine((r) => r.upper, true);    // Upper band\n    drawLine((r) => r.lower, true);    // Lower band\n\n    // Fill band area\n    const upperPoints: [number, number][] = [];\n    const lowerPoints: [number, number][] = [];\n\n    for (const r of results) {\n      if (r.upper == null || r.lower == null) continue;\n      const x = scale.xToPixel(r.index, viewport, chartWidth);\n      upperPoints.push([x, scale.yToPixel(r.upper, priceRange, chartHeight)]);\n      lowerPoints.push([x, scale.yToPixel(r.lower, priceRange, chartHeight)]);\n    }\n\n    if (upperPoints.length < 2) return;\n\n    ctx.beginPath();\n    upperPoints.forEach(([x, y], i) => i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y));\n    lowerPoints.reverse().forEach(([x, y]) => ctx.lineTo(x, y));\n    ctx.closePath();\n    ctx.fillStyle = `${this.color}12`;\n    ctx.fill();\n  }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class KeltnerChannels implements IIndicator {\n  readonly name: string;\n  readonly color: string;\n\n  constructor(\n    private readonly period = 20,\n    private readonly mult = 2,\n    private readonly atrPeriod = 10,\n    color = '#4caf50',\n    name = 'KC',\n  ) {\n    this.name = name;\n    this.color = color;\n  }\n\n  compute(data: OHLCVBar[]): IndicatorResult[] {\n    const results: IndicatorResult[] = [];\n    const emaK = 2 / (this.period + 1);\n\n    let ema: number | null = null;\n    let atr: number | null = null;\n\n    for (let i = 0; i < data.length; i++) {\n      const bar = data[i];\n\n      if (i < this.period - 1) {\n        results.push({ index: i, value: null, upper: null, lower: null });\n        continue;\n      }\n\n      // Seed or update EMA\n      if (ema === null) {\n        let sum = 0;\n        for (let j = 0; j < this.period; j++) sum += data[i - j].close;\n        ema = sum / this.period;\n      } else {\n        ema = bar.close * emaK + ema * (1 - emaK);\n      }\n\n      // True range for current bar\n      const tr = i === 0\n        ? bar.high - bar.low\n        : Math.max(\n            bar.high - bar.low,\n            Math.abs(bar.high - data[i - 1].close),\n            Math.abs(bar.low - data[i - 1].close),\n          );\n\n      // Seed ATR on first valid bar (i >= period-1 >= atrPeriod-1), then Wilder-smooth\n      if (atr === null) {\n        let trSum = 0;\n        for (let j = 0; j < this.atrPeriod; j++) {\n          const b = data[i - j];\n          const prev = i - j > 0 ? data[i - j - 1] : null;\n          const trj = prev == null\n            ? b.high - b.low\n            : Math.max(\n                b.high - b.low,\n                Math.abs(b.high - prev.close),\n                Math.abs(b.low - prev.close),\n              );\n          trSum += trj;\n        }\n        atr = trSum / this.atrPeriod;\n      } else {\n        atr = (atr * (this.atrPeriod - 1) + tr) / this.atrPeriod;\n      }\n\n      const upper = ema + this.mult * atr;\n      const lower = ema - this.mult * atr;\n      results.push({ index: i, value: ema, upper, lower });\n    }\n\n    return results;\n  }\n\n  render(\n    ctx: CanvasRenderingContext2D,\n    results: IndicatorResult[],\n    scale: ScaleManager,\n    viewport: Viewport,\n    chartHeight: number,\n  ): void {\n    const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n    const priceRange = canvas._priceRange;\n    if (!priceRange) return;\n\n    const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n    ctx.lineWidth = 1;\n    ctx.lineJoin = 'round';\n\n    const drawLine = (getValue: (r: IndicatorResult) => number | null | undefined, dash = false) => {\n      if (dash) ctx.setLineDash([4, 3]);\n      ctx.beginPath();\n      let started = false;\n      for (const r of results) {\n        const val = getValue(r);\n        if (val == null) { started = false; continue; }\n        const x = scale.xToPixel(r.index, viewport, chartWidth);\n        const y = scale.yToPixel(val, priceRange, chartHeight);\n        started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n      }\n      ctx.stroke();\n      if (dash) ctx.setLineDash([]);\n    };\n\n    // Middle line (EMA) — solid\n    ctx.strokeStyle = this.color;\n    drawLine((r) => r.value);\n\n    // Upper and lower — dashed\n    ctx.strokeStyle = `${this.color}99`;\n    drawLine((r) => r.upper, true);\n    drawLine((r) => r.lower, true);\n\n    // Fill between upper and lower\n    const upperPoints: [number, number][] = [];\n    const lowerPoints: [number, number][] = [];\n\n    for (const r of results) {\n      if (r.upper == null || r.lower == null) continue;\n      const x = scale.xToPixel(r.index, viewport, chartWidth);\n      upperPoints.push([x, scale.yToPixel(r.upper, priceRange, chartHeight)]);\n      lowerPoints.push([x, scale.yToPixel(r.lower, priceRange, chartHeight)]);\n    }\n\n    if (upperPoints.length < 2) return;\n\n    ctx.beginPath();\n    upperPoints.forEach(([x, y], i) => i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y));\n    lowerPoints.reverse().forEach(([x, y]) => ctx.lineTo(x, y));\n    ctx.closePath();\n    ctx.fillStyle = `${this.color}12`;\n    ctx.fill();\n  }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class DonchianChannels implements IIndicator {\n  readonly name = 'DC';\n  readonly color: string;\n\n  constructor(\n    private readonly period = 20,\n    color = '#26c6da',\n  ) {\n    this.color = color;\n  }\n\n  compute(data: OHLCVBar[]): IndicatorResult[] {\n    return data.map((_, i) => {\n      if (i < this.period - 1) return { index: i, value: null, upper: null, lower: null };\n\n      let highest = -Infinity;\n      let lowest = Infinity;\n      for (let j = i - this.period + 1; j <= i; j++) {\n        if (data[j].high > highest) highest = data[j].high;\n        if (data[j].low < lowest) lowest = data[j].low;\n      }\n\n      const middle = (highest + lowest) / 2;\n      return { index: i, value: middle, upper: highest, lower: lowest };\n    });\n  }\n\n  render(\n    ctx: CanvasRenderingContext2D,\n    results: IndicatorResult[],\n    scale: ScaleManager,\n    viewport: Viewport,\n    chartHeight: number,\n  ): void {\n    const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n    const priceRange = canvas._priceRange;\n    if (!priceRange) return;\n\n    const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n    ctx.lineWidth = 1;\n    ctx.lineJoin = 'round';\n\n    const drawLine = (getValue: (r: IndicatorResult) => number | null | undefined, dash = false) => {\n      if (dash) ctx.setLineDash([4, 3]);\n      ctx.beginPath();\n      let started = false;\n      for (const r of results) {\n        const val = getValue(r);\n        if (val == null) { started = false; continue; }\n        const x = scale.xToPixel(r.index, viewport, chartWidth);\n        const y = scale.yToPixel(val, priceRange, chartHeight);\n        started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n      }\n      ctx.stroke();\n      if (dash) ctx.setLineDash([]);\n    };\n\n    // Middle line — dashed, full color\n    ctx.strokeStyle = this.color;\n    drawLine((r) => r.value, true);\n\n    // Upper and lower — solid, 60% opacity\n    ctx.strokeStyle = `${this.color}99`;\n    drawLine((r) => r.upper);\n    drawLine((r) => r.lower);\n\n    // Fill between upper and lower at 8% opacity\n    const upperPoints: [number, number][] = [];\n    const lowerPoints: [number, number][] = [];\n\n    for (const r of results) {\n      if (r.upper == null || r.lower == null) continue;\n      const x = scale.xToPixel(r.index, viewport, chartWidth);\n      upperPoints.push([x, scale.yToPixel(r.upper, priceRange, chartHeight)]);\n      lowerPoints.push([x, scale.yToPixel(r.lower, priceRange, chartHeight)]);\n    }\n\n    if (upperPoints.length < 2) return;\n\n    ctx.beginPath();\n    upperPoints.forEach(([x, y], i) => i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y));\n    lowerPoints.slice().reverse().forEach(([x, y]) => ctx.lineTo(x, y));\n    ctx.closePath();\n    ctx.fillStyle = `${this.color}14`;\n    ctx.fill();\n  }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class ATR implements IIndicator {\n    readonly name: string;\n    readonly color: string;\n    readonly pane = 'sub' as const;\n    readonly paneHeight = 80;\n\n    constructor(\n        private readonly period: number = 14,\n        color = '#ff5722',\n        name = 'ATR',\n    ) {\n        this.name = name;\n        this.color = color;\n    }\n\n    compute(data: OHLCVBar[]): IndicatorResult[] {\n        const results: IndicatorResult[] = [];\n\n        if (data.length === 0) return results;\n\n        // Compute True Range values\n        const tr: number[] = [];\n        for (let i = 0; i < data.length; i++) {\n            if (i === 0) {\n                tr.push(data[i].high - data[i].low);\n            } else {\n                const prevClose = data[i - 1].close;\n                tr.push(Math.max(\n                    data[i].high - data[i].low,\n                    Math.abs(data[i].high - prevClose),\n                    Math.abs(data[i].low - prevClose),\n                ));\n            }\n        }\n\n        // Need at least `period` bars to compute first ATR\n        if (data.length < this.period) {\n            return data.map((_, i) => ({ index: i, value: null }));\n        }\n\n        // Seed with SMA of first `period` TR values\n        let atr = 0;\n        for (let i = 0; i < this.period; i++) {\n            atr += tr[i];\n        }\n        atr /= this.period;\n\n        // Fill nulls before first ATR value\n        for (let i = 0; i < this.period - 1; i++) {\n            results.push({ index: i, value: null });\n        }\n\n        // First ATR value at index period-1\n        results.push({ index: this.period - 1, value: atr });\n\n        // Wilder's smoothing for subsequent values\n        for (let i = this.period; i < data.length; i++) {\n            atr = (atr * (this.period - 1) + tr[i]) / this.period;\n            results.push({ index: i, value: atr });\n        }\n\n        return results;\n    }\n\n    getValueRange(results: IndicatorResult[]): PriceRange {\n        let maxVal = 0.0001;\n        for (const r of results) {\n            if (r.value != null) maxVal = Math.max(maxVal, r.value);\n        }\n        return { min: 0, max: maxVal * 1.2 };\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        results: IndicatorResult[],\n        scale: ScaleManager,\n        viewport: Viewport,\n        paneHeight: number,\n        rangeOverride?: PriceRange,\n    ): void {\n        const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n            ?? ctx.canvas.width;\n\n        // Compute range from results\n        let maxVal = 0.0001;\n        for (const r of results) {\n            if (r.value != null) maxVal = Math.max(maxVal, r.value);\n        }\n        const range = rangeOverride ?? { min: 0, max: maxVal * 1.2 };\n\n        // Collect path points\n        const points: { x: number; y: number }[] = [];\n        for (const r of results) {\n            if (r.value == null) continue;\n            points.push({\n                x: scale.xToPixel(r.index, viewport, chartWidth),\n                y: scale.yToPixel(r.value, range, paneHeight),\n            });\n        }\n\n        if (points.length === 0) return;\n\n        // Filled area under line\n        const baseY = scale.yToPixel(0, range, paneHeight);\n        ctx.beginPath();\n        ctx.moveTo(points[0].x, baseY);\n        for (const p of points) ctx.lineTo(p.x, p.y);\n        ctx.lineTo(points[points.length - 1].x, baseY);\n        ctx.closePath();\n        ctx.fillStyle = this.color + '33';\n        ctx.fill();\n\n        // Line on top\n        ctx.beginPath();\n        ctx.strokeStyle = this.color;\n        ctx.lineWidth = 1.5;\n        ctx.lineJoin = 'round';\n        let started = false;\n        for (const r of results) {\n            if (r.value == null) { started = false; continue; }\n            const x = scale.xToPixel(r.index, viewport, chartWidth);\n            const y = scale.yToPixel(r.value, range, paneHeight);\n            started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n        }\n        ctx.stroke();\n    }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport { getSource, type PriceSource } from './sourceField.js';\n\nexport class RSI implements IIndicator {\n    readonly name: string;\n    readonly color: string;\n    readonly pane = 'sub' as const;\n    readonly paneHeight = 80;\n\n    constructor(\n        private readonly period: number = 14,\n        color = '#e8b84b',\n        name = 'RSI',\n        private readonly source: PriceSource = 'close',\n    ) {\n        this.name = name;\n        this.color = color;\n    }\n\n    compute(data: OHLCVBar[]): IndicatorResult[] {\n        const results: IndicatorResult[] = [];\n\n        if (data.length < this.period + 1) {\n            return data.map((_, i) => ({ index: i, value: null }));\n        }\n\n        // Wilder's smoothing: seed with simple average, then exponential\n        let avgGain = 0;\n        let avgLoss = 0;\n\n        // Initial average over first `period` changes\n        for (let i = 1; i <= this.period; i++) {\n            const delta = getSource(data[i], this.source) - getSource(data[i - 1], this.source);\n            if (delta > 0) avgGain += delta;\n            else avgLoss += Math.abs(delta);\n        }\n        avgGain /= this.period;\n        avgLoss /= this.period;\n\n        // Fill nulls for bars before we have a result\n        for (let i = 0; i < this.period; i++) {\n            results.push({ index: i, value: null });\n        }\n\n        // First RSI value\n        const rs0 = avgLoss === 0 ? Infinity : avgGain / avgLoss;\n        results.push({ index: this.period, value: avgLoss === 0 ? 100 : 100 - 100 / (1 + rs0) });\n\n        // Subsequent values via Wilder's smoothing\n        for (let i = this.period + 1; i < data.length; i++) {\n            const delta = getSource(data[i], this.source) - getSource(data[i - 1], this.source);\n            const gain  = delta > 0 ? delta : 0;\n            const loss  = delta < 0 ? Math.abs(delta) : 0;\n            avgGain = (avgGain * (this.period - 1) + gain) / this.period;\n            avgLoss = (avgLoss * (this.period - 1) + loss) / this.period;\n            const rs = avgLoss === 0 ? Infinity : avgGain / avgLoss;\n            results.push({ index: i, value: avgLoss === 0 ? 100 : 100 - 100 / (1 + rs) });\n        }\n\n        return results;\n    }\n\n    getValueRange(_results: IndicatorResult[]): PriceRange {\n        return { min: 0, max: 100 };\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        results: IndicatorResult[],\n        scale: ScaleManager,\n        viewport: Viewport,\n        paneHeight: number,\n        rangeOverride?: PriceRange,\n    ): void {\n        const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n            ?? ctx.canvas.width;\n\n        const range = rangeOverride ?? { min: 0, max: 100 };\n\n        // Overbought / oversold fill zones\n        const y70 = scale.yToPixel(70, range, paneHeight);\n        const y30 = scale.yToPixel(30, range, paneHeight);\n\n        ctx.fillStyle = 'rgba(239,83,80,0.06)';\n        ctx.fillRect(0, 0, chartWidth, y70);\n\n        ctx.fillStyle = 'rgba(38,166,154,0.06)';\n        ctx.fillRect(0, y30, chartWidth, paneHeight - y30);\n\n        // Reference lines\n        ctx.save();\n        ctx.setLineDash([4, 4]);\n        ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n        ctx.lineWidth = 1;\n        for (const level of [70, 50, 30]) {\n            const y = scale.yToPixel(level, range, paneHeight);\n            ctx.beginPath();\n            ctx.moveTo(0, y);\n            ctx.lineTo(chartWidth, y);\n            ctx.stroke();\n        }\n        ctx.setLineDash([]);\n        ctx.restore();\n\n        // RSI line\n        ctx.beginPath();\n        ctx.strokeStyle = this.color;\n        ctx.lineWidth = 1.5;\n        ctx.lineJoin = 'round';\n\n        let started = false;\n        for (const r of results) {\n            if (r.value === null) { started = false; continue; }\n            const x = scale.xToPixel(r.index, viewport, chartWidth);\n            const y = scale.yToPixel(r.value, range, paneHeight);\n            started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n        }\n        ctx.stroke();\n    }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class Stochastic implements IIndicator {\n    readonly name = 'Stoch';\n    readonly color: string;\n    readonly pane = 'sub' as const;\n    readonly paneHeight = 80;\n\n    constructor(\n        private readonly kPeriod: number = 14,\n        private readonly dPeriod: number = 3,\n        color = '#e040fb',\n    ) {\n        this.color = color;\n    }\n\n    compute(data: OHLCVBar[]): IndicatorResult[] {\n        const results: IndicatorResult[] = [];\n        const kValues: (number | null)[] = [];\n\n        for (let i = 0; i < data.length; i++) {\n            if (i < this.kPeriod - 1) {\n                kValues.push(null);\n                results.push({ index: i, value: null, upper: null });\n                continue;\n            }\n\n            let lowestLow = Infinity;\n            let highestHigh = -Infinity;\n            for (let j = i - this.kPeriod + 1; j <= i; j++) {\n                if (data[j].low < lowestLow) lowestLow = data[j].low;\n                if (data[j].high > highestHigh) highestHigh = data[j].high;\n            }\n\n            const denom = highestHigh - lowestLow;\n            const k = denom === 0 ? 50 : ((data[i].close - lowestLow) / denom) * 100;\n            kValues.push(k);\n            results.push({ index: i, value: k, upper: null });\n        }\n\n        // Compute %D = SMA(dPeriod) of %K\n        for (let i = 0; i < data.length; i++) {\n            const kVal = kValues[i];\n            if (kVal === null) continue;\n\n            // Check if we have enough non-null kValues ending at i\n            let count = 0;\n            let sum = 0;\n            for (let j = i; j >= 0 && count < this.dPeriod; j--) {\n                if (kValues[j] === null) break;\n                sum += kValues[j] as number;\n                count++;\n            }\n            if (count === this.dPeriod) {\n                results[i].upper = sum / this.dPeriod;\n            }\n        }\n\n        return results;\n    }\n\n    getValueRange(_results: IndicatorResult[]): PriceRange {\n        return { min: 0, max: 100 };\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        results: IndicatorResult[],\n        scale: ScaleManager,\n        viewport: Viewport,\n        paneHeight: number,\n        rangeOverride?: PriceRange,\n    ): void {\n        const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n            ?? ctx.canvas.width;\n\n        const range = rangeOverride ?? { min: 0, max: 100 };\n\n        // Overbought zone (80-100) red fill\n        const y80 = scale.yToPixel(80, range, paneHeight);\n        const y20 = scale.yToPixel(20, range, paneHeight);\n\n        ctx.fillStyle = 'rgba(239,83,80,0.06)';\n        ctx.fillRect(0, 0, chartWidth, y80);\n\n        ctx.fillStyle = 'rgba(38,166,154,0.06)';\n        ctx.fillRect(0, y20, chartWidth, paneHeight - y20);\n\n        // Reference lines at 80, 50, 20\n        ctx.save();\n        ctx.setLineDash([4, 4]);\n        ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n        ctx.lineWidth = 1;\n        for (const level of [80, 50, 20]) {\n            const y = scale.yToPixel(level, range, paneHeight);\n            ctx.beginPath();\n            ctx.moveTo(0, y);\n            ctx.lineTo(chartWidth, y);\n            ctx.stroke();\n        }\n        ctx.setLineDash([]);\n        ctx.restore();\n\n        // %K line (this.color)\n        ctx.beginPath();\n        ctx.strokeStyle = this.color;\n        ctx.lineWidth = 1.5;\n        ctx.lineJoin = 'round';\n        let started = false;\n        for (const r of results) {\n            if (r.value === null) { started = false; continue; }\n            const x = scale.xToPixel(r.index, viewport, chartWidth);\n            const y = scale.yToPixel(r.value, range, paneHeight);\n            started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n        }\n        ctx.stroke();\n\n        // %D line (orange)\n        ctx.beginPath();\n        ctx.strokeStyle = '#ff9800';\n        ctx.lineWidth = 1;\n        ctx.lineJoin = 'round';\n        started = false;\n        for (const r of results) {\n            if (r.upper == null) { started = false; continue; }\n            const x = scale.xToPixel(r.index, viewport, chartWidth);\n            const y = scale.yToPixel(r.upper, range, paneHeight);\n            started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n        }\n        ctx.stroke();\n    }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nfunction computeSMA(values: (number | null)[], period: number): (number | null)[] {\n    const result: (number | null)[] = [];\n    for (let i = 0; i < values.length; i++) {\n        if (i < period - 1) { result.push(null); continue; }\n        let sum = 0;\n        let valid = true;\n        for (let j = i - period + 1; j <= i; j++) {\n            if (values[j] === null) { valid = false; break; }\n            sum += values[j] as number;\n        }\n        result.push(valid ? sum / period : null);\n    }\n    return result;\n}\n\nexport class StochRSI implements IIndicator {\n    readonly name = 'StochRSI';\n    readonly color: string;\n    readonly pane = 'sub' as const;\n    readonly paneHeight = 80;\n\n    constructor(\n        private readonly rsiPeriod: number = 14,\n        private readonly stochPeriod: number = 14,\n        private readonly kPeriod: number = 3,\n        private readonly dPeriod: number = 3,\n        color = '#00e5ff',\n    ) {\n        this.color = color;\n    }\n\n    compute(data: OHLCVBar[]): IndicatorResult[] {\n        // Step 1: Compute RSI with Wilder's smoothing\n        const rsiValues: (number | null)[] = [];\n\n        if (data.length < this.rsiPeriod + 1) {\n            return data.map((_, i) => ({ index: i, value: null, upper: null }));\n        }\n\n        let avgGain = 0;\n        let avgLoss = 0;\n        for (let i = 1; i <= this.rsiPeriod; i++) {\n            const delta = data[i].close - data[i - 1].close;\n            if (delta > 0) avgGain += delta;\n            else avgLoss += Math.abs(delta);\n        }\n        avgGain /= this.rsiPeriod;\n        avgLoss /= this.rsiPeriod;\n\n        for (let i = 0; i < this.rsiPeriod; i++) rsiValues.push(null);\n\n        const rs0 = avgLoss === 0 ? Infinity : avgGain / avgLoss;\n        rsiValues.push(avgLoss === 0 ? 100 : 100 - 100 / (1 + rs0));\n\n        for (let i = this.rsiPeriod + 1; i < data.length; i++) {\n            const delta = data[i].close - data[i - 1].close;\n            const gain = delta > 0 ? delta : 0;\n            const loss = delta < 0 ? Math.abs(delta) : 0;\n            avgGain = (avgGain * (this.rsiPeriod - 1) + gain) / this.rsiPeriod;\n            avgLoss = (avgLoss * (this.rsiPeriod - 1) + loss) / this.rsiPeriod;\n            const rs = avgLoss === 0 ? Infinity : avgGain / avgLoss;\n            rsiValues.push(avgLoss === 0 ? 100 : 100 - 100 / (1 + rs));\n        }\n\n        // Step 2: Apply Stochastic formula to RSI values\n        const stochRsiValues: (number | null)[] = [];\n        for (let i = 0; i < data.length; i++) {\n            if (rsiValues[i] === null) { stochRsiValues.push(null); continue; }\n\n            // Check we have stochPeriod non-null rsi values ending at i\n            if (i < this.rsiPeriod + this.stochPeriod - 1) {\n                stochRsiValues.push(null);\n                continue;\n            }\n\n            let minRsi = Infinity;\n            let maxRsi = -Infinity;\n            let valid = true;\n            for (let j = i - this.stochPeriod + 1; j <= i; j++) {\n                if (rsiValues[j] === null) { valid = false; break; }\n                const v = rsiValues[j] as number;\n                if (v < minRsi) minRsi = v;\n                if (v > maxRsi) maxRsi = v;\n            }\n            if (!valid) { stochRsiValues.push(null); continue; }\n\n            const denom = maxRsi - minRsi;\n            const stoch = denom === 0 ? 50 : ((rsiValues[i] as number) - minRsi) / denom * 100;\n            stochRsiValues.push(stoch);\n        }\n\n        // Step 3: K = SMA(kPeriod) of stochRSI, D = SMA(dPeriod) of K\n        const kLine = computeSMA(stochRsiValues, this.kPeriod);\n        const dLine = computeSMA(kLine, this.dPeriod);\n\n        return data.map((_, i) => ({\n            index: i,\n            value: kLine[i] ?? null,\n            upper: dLine[i] ?? null,\n        }));\n    }\n\n    getValueRange(_results: IndicatorResult[]): PriceRange {\n        return { min: 0, max: 100 };\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        results: IndicatorResult[],\n        scale: ScaleManager,\n        viewport: Viewport,\n        paneHeight: number,\n        rangeOverride?: PriceRange,\n    ): void {\n        const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n            ?? ctx.canvas.width;\n\n        const range = rangeOverride ?? { min: 0, max: 100 };\n\n        // Overbought/oversold zone fills\n        const y80 = scale.yToPixel(80, range, paneHeight);\n        const y20 = scale.yToPixel(20, range, paneHeight);\n\n        ctx.fillStyle = 'rgba(239,83,80,0.06)';\n        ctx.fillRect(0, 0, chartWidth, y80);\n\n        ctx.fillStyle = 'rgba(38,166,154,0.06)';\n        ctx.fillRect(0, y20, chartWidth, paneHeight - y20);\n\n        // Reference lines at 80, 50, 20\n        ctx.save();\n        ctx.setLineDash([4, 4]);\n        ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n        ctx.lineWidth = 1;\n        for (const level of [80, 50, 20]) {\n            const y = scale.yToPixel(level, range, paneHeight);\n            ctx.beginPath();\n            ctx.moveTo(0, y);\n            ctx.lineTo(chartWidth, y);\n            ctx.stroke();\n        }\n        ctx.setLineDash([]);\n        ctx.restore();\n\n        // K line (this.color)\n        ctx.beginPath();\n        ctx.strokeStyle = this.color;\n        ctx.lineWidth = 1.5;\n        ctx.lineJoin = 'round';\n        let started = false;\n        for (const r of results) {\n            if (r.value === null) { started = false; continue; }\n            const x = scale.xToPixel(r.index, viewport, chartWidth);\n            const y = scale.yToPixel(r.value, range, paneHeight);\n            started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n        }\n        ctx.stroke();\n\n        // D line (orange)\n        ctx.beginPath();\n        ctx.strokeStyle = '#ff9800';\n        ctx.lineWidth = 1;\n        ctx.lineJoin = 'round';\n        started = false;\n        for (const r of results) {\n            if (r.upper == null) { started = false; continue; }\n            const x = scale.xToPixel(r.index, viewport, chartWidth);\n            const y = scale.yToPixel(r.upper, range, paneHeight);\n            started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n        }\n        ctx.stroke();\n    }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport { getSource, type PriceSource } from './sourceField.js';\n\nfunction computeEMA(data: number[], period: number): (number | null)[] {\n    const k = 2 / (period + 1);\n    const results: (number | null)[] = [];\n    let ema: number | null = null;\n\n    for (let i = 0; i < data.length; i++) {\n        if (i < period - 1) { results.push(null); continue; }\n        if (ema === null) {\n            let sum = 0;\n            for (let j = 0; j < period; j++) sum += data[i - j];\n            ema = sum / period;\n        } else {\n            ema = data[i] * k + ema * (1 - k);\n        }\n        results.push(ema);\n    }\n    return results;\n}\n\nexport class MACD implements IIndicator {\n    readonly name: string;\n    readonly color: string;\n    readonly pane = 'sub' as const;\n    readonly paneHeight = 80;\n\n    constructor(\n        private readonly fast: number = 12,\n        private readonly slow: number = 26,\n        private readonly signal: number = 9,\n        color = '#2196f3',\n        name = 'MACD',\n        private readonly source: PriceSource = 'close',\n    ) {\n        this.name = name;\n        this.color = color;\n    }\n\n    compute(data: OHLCVBar[]): IndicatorResult[] {\n        const closes = data.map(b => getSource(b, this.source));\n        const fastEMA = computeEMA(closes, this.fast);\n        const slowEMA = computeEMA(closes, this.slow);\n\n        // MACD line = fast EMA - slow EMA (null until both exist)\n        const macdLine: (number | null)[] = closes.map((_, i) => {\n            if (fastEMA[i] === null || slowEMA[i] === null) return null;\n            return (fastEMA[i] as number) - (slowEMA[i] as number);\n        });\n\n        // Signal line = EMA(signal period) of MACD line\n        const macdValues = macdLine.map(v => v ?? 0); // temp: pad with 0 for EMA calc\n        const rawSignal = computeEMA(macdValues, this.signal);\n\n        return data.map((_, i) => {\n            const macd = macdLine[i];\n            if (macd === null) return { index: i, value: null, upper: null, lower: null, histogram: null };\n\n            // Only emit signal/histogram once signal period has warmed up past slow period\n            const signalStart = this.slow - 1 + this.signal - 1;\n            const sig = i >= signalStart ? rawSignal[i] : null;\n            const hist = macd !== null && sig !== null ? macd - sig : null;\n\n            return {\n                index: i,\n                value: macd,         // MACD line\n                upper: sig,          // Signal line\n                lower: hist,         // Histogram\n            };\n        });\n    }\n\n    getValueRange(results: IndicatorResult[]): PriceRange {\n        let maxAbs = 0.0001;\n        for (const r of results) {\n            if (r.value != null) maxAbs = Math.max(maxAbs, Math.abs(r.value));\n            if (r.upper != null) maxAbs = Math.max(maxAbs, Math.abs(r.upper));\n            if (r.lower != null) maxAbs = Math.max(maxAbs, Math.abs(r.lower));\n        }\n        return { min: -maxAbs * 1.3, max: maxAbs * 1.3 };\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        results: IndicatorResult[],\n        scale: ScaleManager,\n        viewport: Viewport,\n        paneHeight: number,\n        rangeOverride?: PriceRange,\n    ): void {\n        const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n            ?? ctx.canvas.width;\n\n        // Dynamic range from visible values\n        let maxAbs = 0.0001;\n        for (const r of results) {\n            if (r.value  != null) maxAbs = Math.max(maxAbs, Math.abs(r.value));\n            if (r.upper  != null) maxAbs = Math.max(maxAbs, Math.abs(r.upper));\n            if (r.lower  != null) maxAbs = Math.max(maxAbs, Math.abs(r.lower));\n        }\n        const range = rangeOverride ?? { min: -maxAbs * 1.3, max: maxAbs * 1.3 };\n        const zeroY = scale.yToPixel(0, range, paneHeight);\n\n        // Zero line\n        ctx.strokeStyle = 'rgba(150,150,150,0.3)';\n        ctx.lineWidth = 1;\n        ctx.beginPath();\n        ctx.moveTo(0, zeroY);\n        ctx.lineTo(chartWidth, zeroY);\n        ctx.stroke();\n\n        // Histogram bars (lower)\n        const bodyW = Math.max(scale.candleBodyWidth(viewport, chartWidth), 1);\n        for (const r of results) {\n            if (r.lower == null) continue;\n            const x    = scale.xToPixel(r.index, viewport, chartWidth);\n            const barY = scale.yToPixel(r.lower, range, paneHeight);\n            const h    = Math.abs(barY - zeroY);\n            const top  = Math.min(barY, zeroY);\n            ctx.fillStyle = r.lower >= 0 ? 'rgba(38,166,154,0.55)' : 'rgba(239,83,80,0.55)';\n            ctx.fillRect(x - bodyW / 2, top, bodyW, h);\n        }\n\n        // MACD line (value)\n        ctx.beginPath();\n        ctx.strokeStyle = this.color;\n        ctx.lineWidth = 1.5;\n        ctx.lineJoin = 'round';\n        let started = false;\n        for (const r of results) {\n            if (r.value == null) { started = false; continue; }\n            const x = scale.xToPixel(r.index, viewport, chartWidth);\n            const y = scale.yToPixel(r.value, range, paneHeight);\n            started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n        }\n        ctx.stroke();\n\n        // Signal line (upper)\n        ctx.beginPath();\n        ctx.strokeStyle = '#ff6b35';\n        ctx.lineWidth = 1;\n        ctx.lineJoin = 'round';\n        started = false;\n        for (const r of results) {\n            if (r.upper == null) { started = false; continue; }\n            const x = scale.xToPixel(r.index, viewport, chartWidth);\n            const y = scale.yToPixel(r.upper, range, paneHeight);\n            started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n        }\n        ctx.stroke();\n    }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class CCI implements IIndicator {\n    readonly name = 'CCI';\n    readonly color: string;\n    readonly pane = 'sub' as const;\n    readonly paneHeight = 80;\n\n    constructor(\n        private readonly period: number = 20,\n        color = '#4db6ac',\n    ) {\n        this.color = color;\n    }\n\n    compute(data: OHLCVBar[]): IndicatorResult[] {\n        return data.map((_, i) => {\n            if (i < this.period - 1) return { index: i, value: null };\n\n            const slice = data.slice(i - this.period + 1, i + 1);\n            const tpSlice = slice.map(b => (b.high + b.low + b.close) / 3);\n            const tp = tpSlice[tpSlice.length - 1];\n            const sma = tpSlice.reduce((s, v) => s + v, 0) / this.period;\n            const meanDev = tpSlice.reduce((s, v) => s + Math.abs(v - sma), 0) / this.period;\n\n            if (meanDev === 0) return { index: i, value: 0 };\n            return { index: i, value: (tp - sma) / (0.015 * meanDev) };\n        });\n    }\n\n    getValueRange(results: IndicatorResult[]): PriceRange {\n        let maxAbs = 0.0001;\n        for (const r of results) {\n            if (r.value != null) maxAbs = Math.max(maxAbs, Math.abs(r.value));\n        }\n        return { min: -maxAbs * 1.3, max: maxAbs * 1.3 };\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        results: IndicatorResult[],\n        scale: ScaleManager,\n        viewport: Viewport,\n        paneHeight: number,\n        rangeOverride?: PriceRange,\n    ): void {\n        const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n            ?? ctx.canvas.width;\n\n        // Dynamic range\n        let maxAbs = 0.0001;\n        for (const r of results) {\n            if (r.value != null) maxAbs = Math.max(maxAbs, Math.abs(r.value));\n        }\n        const range = rangeOverride ?? { min: -maxAbs * 1.3, max: maxAbs * 1.3 };\n\n        // Overbought zone (above 100) red fill\n        const y100 = scale.yToPixel(100, range, paneHeight);\n        const yNeg100 = scale.yToPixel(-100, range, paneHeight);\n\n        ctx.fillStyle = 'rgba(239,83,80,0.10)';\n        ctx.fillRect(0, 0, chartWidth, y100);\n\n        ctx.fillStyle = 'rgba(38,166,154,0.10)';\n        ctx.fillRect(0, yNeg100, chartWidth, paneHeight - yNeg100);\n\n        // Reference lines at 0, 100, -100\n        ctx.save();\n        ctx.setLineDash([4, 4]);\n        ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n        ctx.lineWidth = 1;\n        for (const level of [100, 0, -100]) {\n            const y = scale.yToPixel(level, range, paneHeight);\n            ctx.beginPath();\n            ctx.moveTo(0, y);\n            ctx.lineTo(chartWidth, y);\n            ctx.stroke();\n        }\n        ctx.setLineDash([]);\n        ctx.restore();\n\n        // CCI line\n        ctx.beginPath();\n        ctx.strokeStyle = this.color;\n        ctx.lineWidth = 1.5;\n        ctx.lineJoin = 'round';\n        let started = false;\n        for (const r of results) {\n            if (r.value === null) { started = false; continue; }\n            const x = scale.xToPixel(r.index, viewport, chartWidth);\n            const y = scale.yToPixel(r.value, range, paneHeight);\n            started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n        }\n        ctx.stroke();\n    }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class WilliamsR implements IIndicator {\n    readonly name = '%R';\n    readonly color: string;\n    readonly pane = 'sub' as const;\n    readonly paneHeight = 80;\n\n    constructor(\n        private readonly period: number = 14,\n        color = '#ff7043',\n    ) {\n        this.color = color;\n    }\n\n    compute(data: OHLCVBar[]): IndicatorResult[] {\n        return data.map((_, i) => {\n            if (i < this.period - 1) return { index: i, value: null };\n\n            let highestHigh = -Infinity;\n            let lowestLow = Infinity;\n            for (let j = i - this.period + 1; j <= i; j++) {\n                if (data[j].high > highestHigh) highestHigh = data[j].high;\n                if (data[j].low < lowestLow) lowestLow = data[j].low;\n            }\n\n            const denom = highestHigh - lowestLow;\n            const r = denom === 0 ? -50 : ((highestHigh - data[i].close) / denom) * -100;\n            return { index: i, value: r };\n        });\n    }\n\n    getValueRange(_results: IndicatorResult[]): PriceRange {\n        return { min: -100, max: 0 };\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        results: IndicatorResult[],\n        scale: ScaleManager,\n        viewport: Viewport,\n        paneHeight: number,\n        rangeOverride?: PriceRange,\n    ): void {\n        const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n            ?? ctx.canvas.width;\n\n        const range = rangeOverride ?? { min: -100, max: 0 };\n\n        // Overbought zone (-20 to 0) red fill\n        const yNeg20 = scale.yToPixel(-20, range, paneHeight);\n        const yNeg80 = scale.yToPixel(-80, range, paneHeight);\n\n        ctx.fillStyle = 'rgba(239,83,80,0.06)';\n        ctx.fillRect(0, 0, chartWidth, yNeg20);\n\n        ctx.fillStyle = 'rgba(38,166,154,0.06)';\n        ctx.fillRect(0, yNeg80, chartWidth, paneHeight - yNeg80);\n\n        // Reference lines at -20, -50, -80\n        ctx.save();\n        ctx.setLineDash([4, 4]);\n        ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n        ctx.lineWidth = 1;\n        for (const level of [-20, -50, -80]) {\n            const y = scale.yToPixel(level, range, paneHeight);\n            ctx.beginPath();\n            ctx.moveTo(0, y);\n            ctx.lineTo(chartWidth, y);\n            ctx.stroke();\n        }\n        ctx.setLineDash([]);\n        ctx.restore();\n\n        // %R line\n        ctx.beginPath();\n        ctx.strokeStyle = this.color;\n        ctx.lineWidth = 1.5;\n        ctx.lineJoin = 'round';\n        let started = false;\n        for (const r of results) {\n            if (r.value === null) { started = false; continue; }\n            const x = scale.xToPixel(r.index, viewport, chartWidth);\n            const y = scale.yToPixel(r.value, range, paneHeight);\n            started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n        }\n        ctx.stroke();\n    }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\nimport { getSource, type PriceSource } from './sourceField.js';\n\nexport class ROC implements IIndicator {\n    readonly name: string;\n    readonly color: string;\n    readonly pane = 'sub' as const;\n    readonly paneHeight = 80;\n\n    constructor(\n        private readonly period: number = 12,\n        color = '#80cbc4',\n        private readonly source: PriceSource = 'close',\n    ) {\n        this.name = 'ROC';\n        this.color = color;\n    }\n\n    compute(data: OHLCVBar[]): IndicatorResult[] {\n        return data.map((_, i) => {\n            if (i < this.period) return { index: i, value: null };\n            const prev = getSource(data[i - this.period], this.source);\n            if (prev === 0) return { index: i, value: null };\n            return { index: i, value: (getSource(data[i], this.source) - prev) / prev * 100 };\n        });\n    }\n\n    getValueRange(results: IndicatorResult[]): PriceRange {\n        let maxAbs = 0.0001;\n        for (const r of results) {\n            if (r.value != null) maxAbs = Math.max(maxAbs, Math.abs(r.value));\n        }\n        return { min: -maxAbs * 1.3, max: maxAbs * 1.3 };\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        results: IndicatorResult[],\n        scale: ScaleManager,\n        viewport: Viewport,\n        paneHeight: number,\n        rangeOverride?: PriceRange,\n    ): void {\n        const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n            ?? ctx.canvas.width;\n\n        // Dynamic range centered on 0\n        let maxAbs = 0.0001;\n        for (const r of results) {\n            if (r.value != null) maxAbs = Math.max(maxAbs, Math.abs(r.value));\n        }\n        const range = rangeOverride ?? { min: -maxAbs * 1.3, max: maxAbs * 1.3 };\n        const zeroY = scale.yToPixel(0, range, paneHeight);\n\n        // Collect valid points\n        const points: { x: number; y: number; value: number }[] = [];\n        for (const r of results) {\n            if (r.value == null) continue;\n            points.push({\n                x: scale.xToPixel(r.index, viewport, chartWidth),\n                y: scale.yToPixel(r.value, range, paneHeight),\n                value: r.value,\n            });\n        }\n\n        // Area fill: above zero green, below zero red\n        if (points.length >= 2) {\n            // Above zero fill\n            ctx.beginPath();\n            ctx.moveTo(points[0].x, zeroY);\n            for (const p of points) {\n                ctx.lineTo(p.x, Math.min(p.y, zeroY));\n            }\n            ctx.lineTo(points[points.length - 1].x, zeroY);\n            ctx.closePath();\n            ctx.fillStyle = 'rgba(38,166,154,0.05)';\n            ctx.fill();\n\n            // Below zero fill\n            ctx.beginPath();\n            ctx.moveTo(points[0].x, zeroY);\n            for (const p of points) {\n                ctx.lineTo(p.x, Math.max(p.y, zeroY));\n            }\n            ctx.lineTo(points[points.length - 1].x, zeroY);\n            ctx.closePath();\n            ctx.fillStyle = 'rgba(239,83,80,0.05)';\n            ctx.fill();\n        }\n\n        // Zero dashed line\n        ctx.save();\n        ctx.setLineDash([4, 4]);\n        ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n        ctx.lineWidth = 1;\n        ctx.beginPath();\n        ctx.moveTo(0, zeroY);\n        ctx.lineTo(chartWidth, zeroY);\n        ctx.stroke();\n        ctx.setLineDash([]);\n        ctx.restore();\n\n        // ROC line\n        ctx.beginPath();\n        ctx.strokeStyle = this.color;\n        ctx.lineWidth = 1.5;\n        ctx.lineJoin = 'round';\n        let started = false;\n        for (const r of results) {\n            if (r.value === null) { started = false; continue; }\n            const x = scale.xToPixel(r.index, viewport, chartWidth);\n            const y = scale.yToPixel(r.value, range, paneHeight);\n            started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n        }\n        ctx.stroke();\n    }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class OBV implements IIndicator {\n    readonly name = 'OBV';\n    readonly color: string;\n    readonly pane = 'sub' as const;\n    readonly paneHeight = 80;\n\n    constructor(color = '#aed581') {\n        this.color = color;\n    }\n\n    compute(data: OHLCVBar[]): IndicatorResult[] {\n        const results: IndicatorResult[] = [];\n        let obv = 0;\n\n        for (let i = 0; i < data.length; i++) {\n            if (i === 0) {\n                obv = data[i].volume ?? 0;\n            } else {\n                if (data[i].close > data[i - 1].close) {\n                    obv += data[i].volume ?? 0;\n                } else if (data[i].close < data[i - 1].close) {\n                    obv -= data[i].volume ?? 0;\n                }\n                // else unchanged\n            }\n            results.push({ index: i, value: obv });\n        }\n\n        return results;\n    }\n\n    getValueRange(results: IndicatorResult[]): PriceRange {\n        let minVal = Infinity;\n        let maxVal = -Infinity;\n        for (const r of results) {\n            if (r.value != null) {\n                if (r.value < minVal) minVal = r.value;\n                if (r.value > maxVal) maxVal = r.value;\n            }\n        }\n        if (minVal === Infinity) return { min: 0, max: 1 };\n        const padding = (maxVal - minVal) * 0.1 || 1;\n        return { min: minVal - padding, max: maxVal + padding };\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        results: IndicatorResult[],\n        scale: ScaleManager,\n        viewport: Viewport,\n        paneHeight: number,\n        rangeOverride?: PriceRange,\n    ): void {\n        const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n            ?? ctx.canvas.width;\n\n        // Dynamic range from min/max OBV\n        let minVal = Infinity;\n        let maxVal = -Infinity;\n        for (const r of results) {\n            if (r.value != null) {\n                if (r.value < minVal) minVal = r.value;\n                if (r.value > maxVal) maxVal = r.value;\n            }\n        }\n        if (minVal === Infinity) return;\n\n        const padding = (maxVal - minVal) * 0.1 || 1;\n        const range = rangeOverride ?? { min: minVal - padding, max: maxVal + padding };\n        const zeroY = scale.yToPixel(0, range, paneHeight);\n\n        // Collect valid points\n        const points: { x: number; y: number; value: number }[] = [];\n        for (const r of results) {\n            if (r.value == null) continue;\n            points.push({\n                x: scale.xToPixel(r.index, viewport, chartWidth),\n                y: scale.yToPixel(r.value, range, paneHeight),\n                value: r.value,\n            });\n        }\n\n        if (points.length === 0) return;\n\n        // Baseline / zero line\n        ctx.save();\n        ctx.setLineDash([4, 4]);\n        ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n        ctx.lineWidth = 1;\n        ctx.beginPath();\n        ctx.moveTo(0, zeroY);\n        ctx.lineTo(chartWidth, zeroY);\n        ctx.stroke();\n        ctx.setLineDash([]);\n        ctx.restore();\n\n        // Area fill under OBV line — green tint if positive, red tint if negative\n        // Use a split fill based on current OBV relative to zero\n        if (points.length >= 2) {\n            ctx.beginPath();\n            ctx.moveTo(points[0].x, zeroY);\n            for (const p of points) ctx.lineTo(p.x, p.y);\n            ctx.lineTo(points[points.length - 1].x, zeroY);\n            ctx.closePath();\n            // Use the last point's value to determine dominant fill color\n            const lastVal = points[points.length - 1].value;\n            ctx.fillStyle = lastVal >= 0\n                ? 'rgba(38,166,154,0.12)'\n                : 'rgba(239,83,80,0.12)';\n            ctx.fill();\n        }\n\n        // OBV line\n        ctx.beginPath();\n        ctx.strokeStyle = this.color;\n        ctx.lineWidth = 1.5;\n        ctx.lineJoin = 'round';\n        let started = false;\n        for (const r of results) {\n            if (r.value == null) { started = false; continue; }\n            const x = scale.xToPixel(r.index, viewport, chartWidth);\n            const y = scale.yToPixel(r.value, range, paneHeight);\n            started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n        }\n        ctx.stroke();\n    }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class VWAP implements IIndicator {\n  readonly name = 'VWAP';\n  readonly color: string;\n\n  constructor(color = '#9c27b0') {\n    this.color = color;\n  }\n\n  compute(data: OHLCVBar[]): IndicatorResult[] {\n    const results: IndicatorResult[] = [];\n    let cumTPV = 0; // cumulative (typicalPrice * volume)\n    let cumVol = 0; // cumulative volume\n\n    for (let i = 0; i < data.length; i++) {\n      const bar = data[i];\n      const typicalPrice = (bar.high + bar.low + bar.close) / 3;\n      cumTPV += typicalPrice * (bar.volume ?? 0);\n      cumVol += bar.volume ?? 0;\n\n      results.push({\n        index: i,\n        value: cumVol === 0 ? null : cumTPV / cumVol,\n      });\n    }\n\n    return results;\n  }\n\n  render(\n    ctx: CanvasRenderingContext2D,\n    results: IndicatorResult[],\n    scale: ScaleManager,\n    viewport: Viewport,\n    chartHeight: number,\n  ): void {\n    const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n    const priceRange = canvas._priceRange;\n    if (!priceRange) return;\n\n    const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n\n    ctx.beginPath();\n    ctx.strokeStyle = this.color;\n    ctx.lineWidth = 1.5;\n    ctx.lineJoin = 'round';\n    ctx.setLineDash([4, 3]);\n\n    let started = false;\n    for (const r of results) {\n      if (r.value === null) { started = false; continue; }\n      const x = scale.xToPixel(r.index, viewport, chartWidth);\n      const y = scale.yToPixel(r.value, priceRange, chartHeight);\n      started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n    }\n\n    ctx.stroke();\n    ctx.setLineDash([]);\n  }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class AccDistribution implements IIndicator {\n    readonly name = 'A/D';\n    readonly color: string;\n    readonly pane = 'sub' as const;\n    readonly paneHeight = 80;\n\n    constructor(color = '#ce93d8') {\n        this.color = color;\n    }\n\n    compute(data: OHLCVBar[]): IndicatorResult[] {\n        const results: IndicatorResult[] = [];\n        let ad = 0;\n\n        for (let i = 0; i < data.length; i++) {\n            const { high, low, close, volume } = data[i];\n            const denom = high - low;\n            const mfm = denom === 0 ? 0 : ((close - low) - (high - close)) / denom;\n            ad += mfm * (volume ?? 0);\n            results.push({ index: i, value: ad });\n        }\n\n        return results;\n    }\n\n    getValueRange(results: IndicatorResult[]): PriceRange {\n        let minVal = Infinity;\n        let maxVal = -Infinity;\n        for (const r of results) {\n            if (r.value != null) {\n                if (r.value < minVal) minVal = r.value;\n                if (r.value > maxVal) maxVal = r.value;\n            }\n        }\n        if (minVal === Infinity) return { min: 0, max: 1 };\n        const padding = (maxVal - minVal) * 0.1 || 1;\n        return { min: minVal - padding, max: maxVal + padding };\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        results: IndicatorResult[],\n        scale: ScaleManager,\n        viewport: Viewport,\n        paneHeight: number,\n        rangeOverride?: PriceRange,\n    ): void {\n        const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n            ?? ctx.canvas.width;\n\n        // Dynamic range\n        let minVal = Infinity;\n        let maxVal = -Infinity;\n        for (const r of results) {\n            if (r.value != null) {\n                if (r.value < minVal) minVal = r.value;\n                if (r.value > maxVal) maxVal = r.value;\n            }\n        }\n        if (minVal === Infinity) return;\n\n        const padding = (maxVal - minVal) * 0.1 || 1;\n        const range = rangeOverride ?? { min: minVal - padding, max: maxVal + padding };\n\n        // Collect valid points\n        const points: { x: number; y: number }[] = [];\n        for (const r of results) {\n            if (r.value == null) continue;\n            points.push({\n                x: scale.xToPixel(r.index, viewport, chartWidth),\n                y: scale.yToPixel(r.value, range, paneHeight),\n            });\n        }\n\n        if (points.length === 0) return;\n\n        // Area fill\n        if (points.length >= 2) {\n            const baseY = paneHeight;\n            ctx.beginPath();\n            ctx.moveTo(points[0].x, baseY);\n            for (const p of points) ctx.lineTo(p.x, p.y);\n            ctx.lineTo(points[points.length - 1].x, baseY);\n            ctx.closePath();\n            ctx.fillStyle = this.color + '20';\n            ctx.fill();\n        }\n\n        // A/D line\n        ctx.beginPath();\n        ctx.strokeStyle = this.color;\n        ctx.lineWidth = 1.5;\n        ctx.lineJoin = 'round';\n        let started = false;\n        for (const r of results) {\n            if (r.value == null) { started = false; continue; }\n            const x = scale.xToPixel(r.index, viewport, chartWidth);\n            const y = scale.yToPixel(r.value, range, paneHeight);\n            started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n        }\n        ctx.stroke();\n    }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class MFI implements IIndicator {\n    readonly name: string;\n    readonly color: string;\n    readonly pane = 'sub' as const;\n    readonly paneHeight = 80;\n\n    constructor(\n        private readonly period: number = 14,\n        color = '#ffab40',\n    ) {\n        this.name = 'MFI';\n        this.color = color;\n    }\n\n    compute(data: OHLCVBar[]): IndicatorResult[] {\n        const results: IndicatorResult[] = [];\n\n        // Compute typical price and raw money flow per bar\n        const tp: number[] = data.map(b => (b.high + b.low + b.close) / 3);\n        const rawMF: number[] = data.map((b, i) => tp[i] * (b.volume ?? 0));\n\n        for (let i = 0; i < data.length; i++) {\n            if (i < this.period) {\n                results.push({ index: i, value: null });\n                continue;\n            }\n\n            let posSum = 0;\n            let negSum = 0;\n            for (let j = i - this.period + 1; j <= i; j++) {\n                if (tp[j] > tp[j - 1]) {\n                    posSum += rawMF[j];\n                } else if (tp[j] < tp[j - 1]) {\n                    negSum += rawMF[j];\n                }\n            }\n\n            if (negSum === 0) {\n                results.push({ index: i, value: 100 });\n            } else {\n                const mfRatio = posSum / negSum;\n                results.push({ index: i, value: 100 - 100 / (1 + mfRatio) });\n            }\n        }\n\n        return results;\n    }\n\n    getValueRange(_results: IndicatorResult[]): PriceRange {\n        return { min: 0, max: 100 };\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        results: IndicatorResult[],\n        scale: ScaleManager,\n        viewport: Viewport,\n        paneHeight: number,\n        rangeOverride?: PriceRange,\n    ): void {\n        const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n            ?? ctx.canvas.width;\n\n        const range = rangeOverride ?? { min: 0, max: 100 };\n\n        // Overbought/oversold zone fills\n        const y80 = scale.yToPixel(80, range, paneHeight);\n        const y20 = scale.yToPixel(20, range, paneHeight);\n\n        ctx.fillStyle = 'rgba(239,83,80,0.06)';\n        ctx.fillRect(0, 0, chartWidth, y80);\n\n        ctx.fillStyle = 'rgba(38,166,154,0.06)';\n        ctx.fillRect(0, y20, chartWidth, paneHeight - y20);\n\n        // Reference lines at 80, 50, 20\n        ctx.save();\n        ctx.setLineDash([4, 4]);\n        ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n        ctx.lineWidth = 1;\n        for (const level of [80, 50, 20]) {\n            const y = scale.yToPixel(level, range, paneHeight);\n            ctx.beginPath();\n            ctx.moveTo(0, y);\n            ctx.lineTo(chartWidth, y);\n            ctx.stroke();\n        }\n        ctx.setLineDash([]);\n        ctx.restore();\n\n        // MFI line\n        ctx.beginPath();\n        ctx.strokeStyle = this.color;\n        ctx.lineWidth = 1.5;\n        ctx.lineJoin = 'round';\n        let started = false;\n        for (const r of results) {\n            if (r.value === null) { started = false; continue; }\n            const x = scale.xToPixel(r.index, viewport, chartWidth);\n            const y = scale.yToPixel(r.value, range, paneHeight);\n            started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n        }\n        ctx.stroke();\n    }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class CMF implements IIndicator {\n    readonly name: string;\n    readonly color: string;\n    readonly pane = 'sub' as const;\n    readonly paneHeight = 80;\n\n    constructor(\n        private readonly period: number = 20,\n        color = '#80deea',\n    ) {\n        this.name = 'CMF';\n        this.color = color;\n    }\n\n    compute(data: OHLCVBar[]): IndicatorResult[] {\n        // Precompute MFM and MFV per bar\n        const mfv: number[] = data.map(b => {\n            const denom = b.high - b.low;\n            const mfm = denom === 0 ? 0 : ((b.close - b.low) - (b.high - b.close)) / denom;\n            return mfm * (b.volume ?? 0);\n        });\n\n        return data.map((b, i) => {\n            if (i < this.period - 1) return { index: i, value: null };\n\n            let sumMFV = 0;\n            let sumVol = 0;\n            for (let j = i - this.period + 1; j <= i; j++) {\n                sumMFV += mfv[j];\n                sumVol += data[j].volume ?? 0;\n            }\n\n            const cmf = sumVol === 0 ? 0 : sumMFV / sumVol;\n            return { index: i, value: cmf };\n        });\n    }\n\n    getValueRange(_results: IndicatorResult[]): PriceRange {\n        return { min: -1, max: 1 };\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        results: IndicatorResult[],\n        scale: ScaleManager,\n        viewport: Viewport,\n        paneHeight: number,\n        rangeOverride?: PriceRange,\n    ): void {\n        const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n            ?? ctx.canvas.width;\n\n        const range = rangeOverride ?? { min: -1, max: 1 };\n        const zeroY = scale.yToPixel(0, range, paneHeight);\n\n        // Fill zones above 0.2 (bullish) and below -0.2 (bearish)\n        const y02  = scale.yToPixel(0.2,  range, paneHeight);\n        const yN02 = scale.yToPixel(-0.2, range, paneHeight);\n\n        ctx.fillStyle = 'rgba(38,166,154,0.08)';\n        ctx.fillRect(0, 0, chartWidth, y02);\n\n        ctx.fillStyle = 'rgba(239,83,80,0.08)';\n        ctx.fillRect(0, yN02, chartWidth, paneHeight - yN02);\n\n        // Reference lines at 0.2, 0, -0.2\n        ctx.save();\n        ctx.setLineDash([4, 4]);\n        ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n        ctx.lineWidth = 1;\n        for (const level of [0.2, 0, -0.2]) {\n            const y = scale.yToPixel(level, range, paneHeight);\n            ctx.beginPath();\n            ctx.moveTo(0, y);\n            ctx.lineTo(chartWidth, y);\n            ctx.stroke();\n        }\n        ctx.setLineDash([]);\n        ctx.restore();\n\n        // Histogram bars\n        const bodyW = Math.max(1, chartWidth / Math.max(results.length, 1) * 0.6);\n        for (const r of results) {\n            if (r.value == null) continue;\n            const x    = scale.xToPixel(r.index, viewport, chartWidth);\n            const barY = scale.yToPixel(r.value, range, paneHeight);\n            const h    = Math.abs(barY - zeroY);\n            const top  = Math.min(barY, zeroY);\n            ctx.fillStyle = r.value >= 0 ? 'rgba(38,166,154,0.45)' : 'rgba(239,83,80,0.45)';\n            ctx.fillRect(x - bodyW / 2, top, bodyW, h);\n        }\n\n        // CMF line on top\n        ctx.beginPath();\n        ctx.strokeStyle = this.color;\n        ctx.lineWidth = 1.5;\n        ctx.lineJoin = 'round';\n        let started = false;\n        for (const r of results) {\n            if (r.value === null) { started = false; continue; }\n            const x = scale.xToPixel(r.index, viewport, chartWidth);\n            const y = scale.yToPixel(r.value, range, paneHeight);\n            started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n        }\n        ctx.stroke();\n    }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class PivotPoints implements IIndicator {\n  readonly name = 'Pivot';\n  readonly color: string;\n\n  constructor(color = '#ffd54f') {\n    this.color = color;\n  }\n\n  compute(data: OHLCVBar[]): IndicatorResult[] {\n    return data.map((_, i) => {\n      if (i === 0) return { index: i, value: null, upper: null, lower: null, signal: null, histogram: null };\n\n      const prev = data[i - 1];\n      const pp = (prev.high + prev.low + prev.close) / 3;\n      const r1 = 2 * pp - prev.low;\n      const s1 = 2 * pp - prev.high;\n      const r2 = pp + (prev.high - prev.low);\n      const s2 = pp - (prev.high - prev.low);\n\n      return {\n        index: i,\n        value: pp,      // PP\n        upper: r1,      // R1\n        lower: s1,      // S1\n        signal: r2,     // R2\n        histogram: s2,  // S2\n      };\n    });\n  }\n\n  render(\n    ctx: CanvasRenderingContext2D,\n    results: IndicatorResult[],\n    scale: ScaleManager,\n    viewport: Viewport,\n    chartHeight: number,\n  ): void {\n    const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n    const priceRange = canvas._priceRange;\n    if (!priceRange) return;\n\n    const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n\n    // Find the last non-null result\n    let lastResult: IndicatorResult | null = null;\n    for (let i = results.length - 1; i >= 0; i--) {\n      if (results[i].value !== null) {\n        lastResult = results[i];\n        break;\n      }\n    }\n\n    if (lastResult === null) return;\n\n    const levels: Array<{ value: number | null | undefined; label: string; color: string }> = [\n      { value: lastResult.signal,    label: 'R2', color: '#b71c1c' },\n      { value: lastResult.upper,     label: 'R1', color: '#ef5350' },\n      { value: lastResult.value,     label: 'PP', color: '#ffd54f' },\n      { value: lastResult.lower,     label: 'S1', color: '#26a69a' },\n      { value: lastResult.histogram, label: 'S2', color: '#1b5e20' },\n    ];\n\n    ctx.lineWidth = 1;\n    ctx.font = '10px sans-serif';\n    ctx.textBaseline = 'middle';\n\n    for (const level of levels) {\n      if (level.value == null) continue;\n      const y = scale.yToPixel(level.value, priceRange, chartHeight);\n\n      // Draw dashed horizontal line across full chart width\n      ctx.beginPath();\n      ctx.setLineDash([6, 4]);\n      ctx.strokeStyle = level.color;\n      ctx.moveTo(0, y);\n      ctx.lineTo(chartWidth, y);\n      ctx.stroke();\n      ctx.setLineDash([]);\n\n      // Draw label on the right side\n      ctx.fillStyle = level.color;\n      ctx.fillText(level.label, chartWidth - 28, y - 6);\n    }\n  }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nconst FIB_RATIOS = [0, 0.236, 0.382, 0.5, 0.618, 0.786, 1.0] as const;\nconst FIB_LABELS = ['0%', '23.6%', '38.2%', '50%', '61.8%', '78.6%', '100%'] as const;\nconst FIB_COLORS = ['#90a4ae', '#4d96ff', '#6bcb77', '#ffd93d', '#ff9800', '#ef5350', '#90a4ae'] as const;\n\nexport class FibRetracementIndicator implements IIndicator {\n  readonly name = 'Fib';\n  readonly color: string;\n\n  constructor(\n    private readonly lookback = 50,\n    color = '#e1bee7',\n  ) {\n    this.color = color;\n  }\n\n  compute(data: OHLCVBar[]): IndicatorResult[] {\n    return data.map((_, i) => {\n      const start = Math.max(0, i - this.lookback + 1);\n      let high = -Infinity;\n      let low = Infinity;\n      for (let j = start; j <= i; j++) {\n        if (data[j].high > high) high = data[j].high;\n        if (data[j].low < low) low = data[j].low;\n      }\n\n      const range = high - low;\n\n      return {\n        index: i,\n        value: high,                            // 100% (top of range)\n        upper: low + 0.618 * range,             // 61.8%\n        lower: low + 0.382 * range,             // 38.2%\n        signal: low + 0.5 * range,              // 50%\n        histogram: low,                         // 0% (bottom of range)\n      };\n    });\n  }\n\n  render(\n    ctx: CanvasRenderingContext2D,\n    results: IndicatorResult[],\n    scale: ScaleManager,\n    viewport: Viewport,\n    chartHeight: number,\n  ): void {\n    const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n    const priceRange = canvas._priceRange;\n    if (!priceRange) return;\n\n    const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n\n    // Use the last result's values\n    let lastResult: IndicatorResult | null = null;\n    for (let i = results.length - 1; i >= 0; i--) {\n      if (results[i].value !== null) {\n        lastResult = results[i];\n        break;\n      }\n    }\n\n    if (lastResult === null) return;\n\n    const high = lastResult.value;\n    const low = lastResult.histogram;\n\n    if (high == null || low == null) return;\n\n    const range = high - low;\n\n    // Compute all 7 fib levels\n    const fibValues = FIB_RATIOS.map((ratio) => low + ratio * range);\n\n    ctx.lineWidth = 1;\n    ctx.font = '10px sans-serif';\n    ctx.textBaseline = 'middle';\n\n    for (let fi = 0; fi < FIB_RATIOS.length; fi++) {\n      const price = fibValues[fi];\n      const y = scale.yToPixel(price, priceRange, chartHeight);\n      const color = FIB_COLORS[fi];\n\n      ctx.beginPath();\n      ctx.setLineDash([6, 4]);\n      ctx.strokeStyle = color;\n      ctx.moveTo(0, y);\n      ctx.lineTo(chartWidth, y);\n      ctx.stroke();\n      ctx.setLineDash([]);\n\n      ctx.fillStyle = color;\n      ctx.fillText(FIB_LABELS[fi], chartWidth - 38, y - 6);\n    }\n  }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class Supertrend implements IIndicator {\n  readonly name = 'Supertrend';\n  readonly color: string;\n\n  constructor(\n    private readonly atrPeriod = 10,\n    private readonly multiplier = 3,\n    color = '#26a69a',\n  ) {\n    this.color = color;\n  }\n\n  compute(data: OHLCVBar[]): IndicatorResult[] {\n    const n = data.length;\n    const results: IndicatorResult[] = [];\n\n    if (n === 0) return results;\n\n    // Compute True Range\n    const tr: number[] = new Array(n).fill(0);\n    for (let i = 0; i < n; i++) {\n      const high = data[i].high;\n      const low = data[i].low;\n      const prevClose = i > 0 ? data[i - 1].close : data[i].close;\n      tr[i] = Math.max(high - low, Math.abs(high - prevClose), Math.abs(low - prevClose));\n    }\n\n    // ATR using Wilder's smoothing seeded with SMA\n    const atr: number[] = new Array(n).fill(0);\n    if (n < this.atrPeriod) {\n      for (let i = 0; i < n; i++) results.push({ index: i, value: null, upper: null });\n      return results;\n    }\n\n    // Seed ATR with SMA of first atrPeriod TRs\n    let atrSeed = 0;\n    for (let i = 0; i < this.atrPeriod; i++) atrSeed += tr[i];\n    atr[this.atrPeriod - 1] = atrSeed / this.atrPeriod;\n\n    for (let i = this.atrPeriod; i < n; i++) {\n      atr[i] = (atr[i - 1] * (this.atrPeriod - 1) + tr[i]) / this.atrPeriod;\n    }\n\n    // Compute Supertrend\n    const finalUpperBand: number[] = new Array(n).fill(0);\n    const finalLowerBand: number[] = new Array(n).fill(0);\n    // direction: 1 = bullish, -1 = bearish\n    const direction: number[] = new Array(n).fill(1);\n\n    for (let i = 0; i < n; i++) {\n      if (i < this.atrPeriod - 1) {\n        results.push({ index: i, value: null, upper: null });\n        continue;\n      }\n\n      const hl2 = (data[i].high + data[i].low) / 2;\n      const basicUpper = hl2 + this.multiplier * atr[i];\n      const basicLower = hl2 - this.multiplier * atr[i];\n\n      if (i === this.atrPeriod - 1) {\n        finalUpperBand[i] = basicUpper;\n        finalLowerBand[i] = basicLower;\n        direction[i] = 1;\n        results.push({ index: i, value: finalLowerBand[i], upper: 1 });\n        continue;\n      }\n\n      const prevClose = data[i - 1].close;\n\n      // Final upper band\n      finalUpperBand[i] =\n        basicUpper < finalUpperBand[i - 1] || prevClose > finalUpperBand[i - 1]\n          ? basicUpper\n          : finalUpperBand[i - 1];\n\n      // Final lower band\n      finalLowerBand[i] =\n        basicLower > finalLowerBand[i - 1] || prevClose < finalLowerBand[i - 1]\n          ? basicLower\n          : finalLowerBand[i - 1];\n\n      // Determine direction\n      if (direction[i - 1] === -1) {\n        direction[i] = data[i].close > finalUpperBand[i] ? 1 : -1;\n      } else {\n        direction[i] = data[i].close < finalLowerBand[i] ? -1 : 1;\n      }\n\n      const supertrendVal = direction[i] === 1 ? finalLowerBand[i] : finalUpperBand[i];\n      results.push({ index: i, value: supertrendVal, upper: direction[i] });\n    }\n\n    return results;\n  }\n\n  render(\n    ctx: CanvasRenderingContext2D,\n    results: IndicatorResult[],\n    scale: ScaleManager,\n    viewport: Viewport,\n    chartHeight: number,\n  ): void {\n    const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n    const priceRange = canvas._priceRange;\n    if (!priceRange) return;\n\n    const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n    ctx.lineWidth = 2;\n    ctx.lineJoin = 'round';\n\n    const BULLISH_COLOR = '#26a69a';\n    const BEARISH_COLOR = '#ef5350';\n\n    let prevDirection: number | null = null;\n\n    // Draw bullish segments\n    ctx.beginPath();\n    ctx.strokeStyle = BULLISH_COLOR;\n    let startedBull = false;\n\n    for (const r of results) {\n      if (r.value == null || r.upper == null) { startedBull = false; continue; }\n      const isBullish = r.upper >= 0;\n      if (!isBullish) { startedBull = false; continue; }\n      if (prevDirection !== 1) startedBull = false;\n      const x = scale.xToPixel(r.index, viewport, chartWidth);\n      const y = scale.yToPixel(r.value, priceRange, chartHeight);\n      startedBull ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (startedBull = true));\n      prevDirection = 1;\n    }\n    ctx.stroke();\n\n    // Draw bearish segments\n    ctx.beginPath();\n    ctx.strokeStyle = BEARISH_COLOR;\n    let startedBear = false;\n    prevDirection = null;\n\n    for (const r of results) {\n      if (r.value == null || r.upper == null) { startedBear = false; continue; }\n      const isBearish = r.upper < 0;\n      if (!isBearish) { startedBear = false; continue; }\n      if (prevDirection !== -1) startedBear = false;\n      const x = scale.xToPixel(r.index, viewport, chartWidth);\n      const y = scale.yToPixel(r.value, priceRange, chartHeight);\n      startedBear ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (startedBear = true));\n      prevDirection = -1;\n    }\n    ctx.stroke();\n  }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class ParabolicSAR implements IIndicator {\n  readonly name = 'PSAR';\n  readonly color: string;\n\n  constructor(\n    private readonly step = 0.02,\n    private readonly maxAF = 0.2,\n    color = '#ff6b9d',\n  ) {\n    this.color = color;\n  }\n\n  compute(data: OHLCVBar[]): IndicatorResult[] {\n    const n = data.length;\n    const results: IndicatorResult[] = [];\n\n    if (n < 2) {\n      for (let i = 0; i < n; i++) results.push({ index: i, value: null, upper: null });\n      return results;\n    }\n\n    // Initialization: start bullish\n    let bullish = true;\n    let af = this.step;\n    let ep = data[0].high;  // Extreme point\n    let sar = data[0].low;  // Initial SAR below price\n\n    results.push({ index: 0, value: null, upper: null });\n\n    for (let i = 1; i < n; i++) {\n      // Calculate new SAR\n      let newSar = sar + af * (ep - sar);\n\n      if (bullish) {\n        // In uptrend: SAR is below price, can't be above last two lows\n        const prevLow = data[i - 1].low;\n        const prevPrevLow = i >= 2 ? data[i - 2].low : data[i - 1].low;\n        newSar = Math.min(newSar, prevLow, prevPrevLow);\n\n        // Check for reversal\n        if (newSar > data[i].low) {\n          // Flip to bearish\n          bullish = false;\n          newSar = ep; // SAR flips to EP (highest high)\n          ep = data[i].low;\n          af = this.step;\n        } else {\n          // Update EP if new high\n          if (data[i].high > ep) {\n            ep = data[i].high;\n            af = Math.min(af + this.step, this.maxAF);\n          }\n        }\n      } else {\n        // In downtrend: SAR is above price, can't be below last two highs\n        const prevHigh = data[i - 1].high;\n        const prevPrevHigh = i >= 2 ? data[i - 2].high : data[i - 1].high;\n        newSar = Math.max(newSar, prevHigh, prevPrevHigh);\n\n        // Check for reversal\n        if (newSar < data[i].high) {\n          // Flip to bullish\n          bullish = true;\n          newSar = ep; // SAR flips to EP (lowest low)\n          ep = data[i].high;\n          af = this.step;\n        } else {\n          // Update EP if new low\n          if (data[i].low < ep) {\n            ep = data[i].low;\n            af = Math.min(af + this.step, this.maxAF);\n          }\n        }\n      }\n\n      sar = newSar;\n      // upper: 1 = bullish, -1 = bearish\n      results.push({ index: i, value: sar, upper: bullish ? 1 : -1 });\n    }\n\n    return results;\n  }\n\n  render(\n    ctx: CanvasRenderingContext2D,\n    results: IndicatorResult[],\n    scale: ScaleManager,\n    viewport: Viewport,\n    chartHeight: number,\n  ): void {\n    const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n    const priceRange = canvas._priceRange;\n    if (!priceRange) return;\n\n    const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n    const BULLISH_COLOR = '#26a69a';\n    const BEARISH_COLOR = '#ef5350';\n\n    for (const r of results) {\n      if (r.value == null || r.upper == null) continue;\n      const x = scale.xToPixel(r.index, viewport, chartWidth);\n      const y = scale.yToPixel(r.value, priceRange, chartHeight);\n\n      ctx.beginPath();\n      ctx.arc(x, y, 2, 0, Math.PI * 2);\n      ctx.fillStyle = r.upper >= 0 ? BULLISH_COLOR : BEARISH_COLOR;\n      ctx.fill();\n    }\n  }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nfunction periodHighLow(data: OHLCVBar[], index: number, period: number): { high: number; low: number } | null {\n  if (index < period - 1) return null;\n  let high = -Infinity;\n  let low = Infinity;\n  for (let j = index - period + 1; j <= index; j++) {\n    if (data[j].high > high) high = data[j].high;\n    if (data[j].low < low) low = data[j].low;\n  }\n  return { high, low };\n}\n\nexport class IchimokuCloud implements IIndicator {\n  readonly name = 'Ichimoku';\n  readonly color: string;\n\n  constructor(\n    private readonly tenkanPeriod = 9,\n    private readonly kijunPeriod = 26,\n    private readonly senkouBPeriod = 52,\n    color = '#b0bec5',\n  ) {\n    this.color = color;\n  }\n\n  compute(data: OHLCVBar[]): IndicatorResult[] {\n    return data.map((bar, i) => {\n      // Tenkan-sen (Conversion Line)\n      const tenkanHL = periodHighLow(data, i, this.tenkanPeriod);\n      const tenkan = tenkanHL !== null ? (tenkanHL.high + tenkanHL.low) / 2 : null;\n\n      // Kijun-sen (Base Line)\n      const kijunHL = periodHighLow(data, i, this.kijunPeriod);\n      const kijun = kijunHL !== null ? (kijunHL.high + kijunHL.low) / 2 : null;\n\n      // Senkou Span A = (Tenkan + Kijun) / 2 (no displacement in stored data)\n      const spanA = tenkan !== null && kijun !== null ? (tenkan + kijun) / 2 : null;\n\n      // Senkou Span B = (highest high + lowest low) over senkouBPeriod\n      const spanBHL = periodHighLow(data, i, this.senkouBPeriod);\n      const spanB = spanBHL !== null ? (spanBHL.high + spanBHL.low) / 2 : null;\n\n      // Chikou Span = close plotted kijunPeriod bars back\n      // Store current close in histogram; render will offset it back by kijunPeriod\n      const chikou = bar.close;\n\n      return {\n        index: i,\n        value: tenkan,\n        upper: kijun,\n        lower: spanA,\n        signal: spanB,\n        histogram: chikou,\n      };\n    });\n  }\n\n  render(\n    ctx: CanvasRenderingContext2D,\n    results: IndicatorResult[],\n    scale: ScaleManager,\n    viewport: Viewport,\n    chartHeight: number,\n  ): void {\n    const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n    const priceRange = canvas._priceRange;\n    if (!priceRange) return;\n\n    const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n    ctx.lineWidth = 1;\n    ctx.lineJoin = 'round';\n\n    const drawLine = (\n      getValue: (r: IndicatorResult) => number | null | undefined,\n      color: string,\n      dash = false,\n    ) => {\n      ctx.strokeStyle = color;\n      if (dash) ctx.setLineDash([4, 3]);\n      ctx.beginPath();\n      let started = false;\n      for (const r of results) {\n        const val = getValue(r);\n        if (val == null) { started = false; continue; }\n        const x = scale.xToPixel(r.index, viewport, chartWidth);\n        const y = scale.yToPixel(val, priceRange, chartHeight);\n        started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n      }\n      ctx.stroke();\n      if (dash) ctx.setLineDash([]);\n    };\n\n    // Draw cloud fill between SpanA (lower) and SpanB (signal)\n    const spanAPoints: [number, number][] = [];\n    const spanBPoints: [number, number][] = [];\n\n    for (const r of results) {\n      if (r.lower == null || r.signal == null) continue;\n      const x = scale.xToPixel(r.index, viewport, chartWidth);\n      spanAPoints.push([x, scale.yToPixel(r.lower, priceRange, chartHeight)]);\n      spanBPoints.push([x, scale.yToPixel(r.signal, priceRange, chartHeight)]);\n    }\n\n    // Per-segment cloud fill — green when SpanA > SpanB (bullish), red otherwise\n    for (let i = 0; i + 1 < spanAPoints.length; i++) {\n      const [x0, a0] = spanAPoints[i];\n      const [x1, a1] = spanAPoints[i + 1];\n      const [, b0] = spanBPoints[i];\n      const [, b1] = spanBPoints[i + 1];\n\n      // spanA is r.lower (SpanA price → pixel y), spanB is r.signal\n      // Note: lower y pixel = higher price\n      // SpanA > SpanB in price means a0 < b0 (smaller y = higher on canvas)\n      const spanAAbove = a0 < b0; // bullish cloud (SpanA above SpanB)\n      ctx.beginPath();\n      ctx.moveTo(x0, a0);\n      ctx.lineTo(x1, a1);\n      ctx.lineTo(x1, b1);\n      ctx.lineTo(x0, b0);\n      ctx.closePath();\n      ctx.fillStyle = spanAAbove\n        ? 'rgba(38, 166, 154, 0.15)'\n        : 'rgba(239, 83, 80, 0.15)';\n      ctx.fill();\n    }\n\n    // SpanA line (dashed, green)\n    drawLine((r) => r.lower, '#26a69a', true);\n\n    // SpanB line (dashed, red)\n    drawLine((r) => r.signal, '#ef5350', true);\n\n    // Tenkan-sen (thin solid, red-ish)\n    drawLine((r) => r.value, '#ef9a9a');\n\n    // Kijun-sen (thin solid, blue-ish)\n    drawLine((r) => r.upper, '#90caf9');\n\n    // Chikou span: draw close shifted back kijunPeriod bars\n    ctx.strokeStyle = '#b0bec5';\n    ctx.beginPath();\n    let started = false;\n    for (const r of results) {\n      if (r.histogram == null) { started = false; continue; }\n      const shiftedIndex = r.index - this.kijunPeriod;\n      if (shiftedIndex < 0) { started = false; continue; }\n      const x = scale.xToPixel(shiftedIndex, viewport, chartWidth);\n      const y = scale.yToPixel(r.histogram, priceRange, chartHeight);\n      started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n    }\n    ctx.stroke();\n  }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class ADX implements IIndicator {\n    readonly name: string;\n    readonly color: string;\n    readonly pane = 'sub' as const;\n    readonly paneHeight = 80;\n\n    constructor(\n        private readonly period: number = 14,\n        color = '#fff176',\n    ) {\n        this.name = 'ADX';\n        this.color = color;\n    }\n\n    compute(data: OHLCVBar[]): IndicatorResult[] {\n        const n = data.length;\n        if (n < this.period + 1) {\n            return data.map((_, i) => ({ index: i, value: null, upper: null, lower: null }));\n        }\n\n        // Compute TR, +DM, -DM for all bars starting at index 1\n        const tr: number[]  = new Array(n).fill(0);\n        const dmP: number[] = new Array(n).fill(0);\n        const dmM: number[] = new Array(n).fill(0);\n\n        tr[0]  = data[0].high - data[0].low;\n        dmP[0] = 0;\n        dmM[0] = 0;\n\n        for (let i = 1; i < n; i++) {\n            const prevClose = data[i - 1].close;\n            const prevHigh  = data[i - 1].high;\n            const prevLow   = data[i - 1].low;\n            const currHigh  = data[i].high;\n            const currLow   = data[i].low;\n\n            tr[i] = Math.max(\n                currHigh - currLow,\n                Math.abs(currHigh - prevClose),\n                Math.abs(currLow  - prevClose),\n            );\n\n            const upMove   = currHigh - prevHigh;\n            const downMove = prevLow  - currLow;\n\n            dmP[i] = (upMove > downMove && upMove > 0) ? upMove   : 0;\n            dmM[i] = (downMove > upMove && downMove > 0) ? downMove : 0;\n        }\n\n        // Seed Wilder's smoothed sums over first `period` bars (indices 0..period-1)\n        let smoothTR = 0;\n        let smoothDP = 0;\n        let smoothDM = 0;\n        for (let i = 0; i < this.period; i++) {\n            smoothTR += tr[i];\n            smoothDP += dmP[i];\n            smoothDM += dmM[i];\n        }\n\n        const results: IndicatorResult[] = [];\n\n        // Nulls for bars before first DI/ADX is available\n        for (let i = 0; i < this.period; i++) {\n            results.push({ index: i, value: null, upper: null, lower: null });\n        }\n\n        // Compute DI values starting at period-1 (index of first seeded bar)\n        // We actually start emitting from index period (first smoothed bar after seed)\n        // But let's do the standard approach: seed then roll from period onwards.\n\n        const diPArr: number[] = new Array(n).fill(0);\n        const diMArr: number[] = new Array(n).fill(0);\n        const dxArr:  number[] = new Array(n).fill(0);\n\n        // First seeded values at index period-1\n        const diP0 = smoothTR === 0 ? 0 : 100 * smoothDP / smoothTR;\n        const diM0 = smoothTR === 0 ? 0 : 100 * smoothDM / smoothTR;\n        const dx0  = (diP0 + diM0 === 0) ? 0 : 100 * Math.abs(diP0 - diM0) / (diP0 + diM0);\n\n        diPArr[this.period - 1] = diP0;\n        diMArr[this.period - 1] = diM0;\n        dxArr[this.period - 1]  = dx0;\n\n        // Replace the last null result with actual DI (no ADX yet)\n        results[this.period - 1] = {\n            index: this.period - 1,\n            value: null,   // ADX not ready yet\n            upper: diP0,\n            lower: diM0,\n        };\n\n        // Roll Wilder's smoothing from period onwards\n        for (let i = this.period; i < n; i++) {\n            smoothTR = smoothTR - smoothTR / this.period + tr[i];\n            smoothDP = smoothDP - smoothDP / this.period + dmP[i];\n            smoothDM = smoothDM - smoothDM / this.period + dmM[i];\n\n            const diP = smoothTR === 0 ? 0 : 100 * smoothDP / smoothTR;\n            const diM = smoothTR === 0 ? 0 : 100 * smoothDM / smoothTR;\n            const dx  = (diP + diM === 0) ? 0 : 100 * Math.abs(diP - diM) / (diP + diM);\n\n            diPArr[i] = diP;\n            diMArr[i] = diM;\n            dxArr[i]  = dx;\n\n            results.push({ index: i, value: null, upper: diP, lower: diM });\n        }\n\n        // Compute ADX using Wilder's EMA of DX, seeded at index period-1\n        // ADX first available at index 2*period - 2 (need period DX values)\n        const adxStart = 2 * this.period - 2;\n\n        // Seed ADX with SMA of first `period` DX values (indices period-1 .. 2*period-2)\n        if (adxStart >= n) return results;\n\n        let adx = 0;\n        for (let i = this.period - 1; i <= adxStart; i++) {\n            adx += dxArr[i];\n        }\n        adx /= (this.period);  // period values from period-1 to 2*period-2 inclusive\n\n        results[adxStart].value = adx;\n\n        for (let i = adxStart + 1; i < n; i++) {\n            adx = (adx * (this.period - 1) + dxArr[i]) / this.period;\n            results[i].value = adx;\n        }\n\n        return results;\n    }\n\n    getValueRange(_results: IndicatorResult[]): PriceRange {\n        return { min: 0, max: 100 };\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        results: IndicatorResult[],\n        scale: ScaleManager,\n        viewport: Viewport,\n        paneHeight: number,\n        rangeOverride?: PriceRange,\n    ): void {\n        const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n            ?? ctx.canvas.width;\n\n        const range = rangeOverride ?? { min: 0, max: 100 };\n\n        // Reference line at 25 (trend threshold)\n        ctx.save();\n        ctx.setLineDash([4, 4]);\n        ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n        ctx.lineWidth = 1;\n        const y25 = scale.yToPixel(25, range, paneHeight);\n        ctx.beginPath();\n        ctx.moveTo(0, y25);\n        ctx.lineTo(chartWidth, y25);\n        ctx.stroke();\n        ctx.setLineDash([]);\n        ctx.restore();\n\n        // Helper to draw a line\n        const drawLine = (\n            getValue: (r: IndicatorResult) => number | null | undefined,\n            strokeColor: string,\n            lineWidth: number,\n        ) => {\n            ctx.beginPath();\n            ctx.strokeStyle = strokeColor;\n            ctx.lineWidth = lineWidth;\n            ctx.lineJoin = 'round';\n            let started = false;\n            for (const r of results) {\n                const val = getValue(r);\n                if (val == null) { started = false; continue; }\n                const x = scale.xToPixel(r.index, viewport, chartWidth);\n                const y = scale.yToPixel(val, range, paneHeight);\n                started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n            }\n            ctx.stroke();\n        };\n\n        // +DI (green)\n        drawLine(r => r.upper, '#26a69a', 1);\n        // -DI (red)\n        drawLine(r => r.lower, '#ef5350', 1);\n        // ADX (this.color, solid, thicker)\n        drawLine(r => r.value, this.color, 1.5);\n\n    }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport, PriceRange } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class AwesomeOscillator implements IIndicator {\n    readonly name = 'AO';\n    readonly color: string;\n    readonly pane = 'sub' as const;\n    readonly paneHeight = 80;\n\n    constructor(\n        private readonly fastPeriod = 5,\n        private readonly slowPeriod = 34,\n        color = '#b0bec5',\n    ) {\n        this.color = color;\n    }\n\n    compute(data: OHLCVBar[]): IndicatorResult[] {\n        // Midpoint = (high + low) / 2\n        const mid: number[] = data.map(b => (b.high + b.low) / 2);\n\n        // SMA helper\n        const sma = (arr: number[], end: number, period: number): number | null => {\n            if (end < period - 1) return null;\n            let sum = 0;\n            for (let j = end - period + 1; j <= end; j++) sum += arr[j];\n            return sum / period;\n        };\n\n        return data.map((_, i) => {\n            const fast = sma(mid, i, this.fastPeriod);\n            const slow = sma(mid, i, this.slowPeriod);\n            if (fast === null || slow === null) return { index: i, value: null };\n            return { index: i, value: fast - slow };\n        });\n    }\n\n    getValueRange(results: IndicatorResult[]): PriceRange {\n        let maxAbs = 0.0001;\n        for (const r of results) {\n            if (r.value != null) maxAbs = Math.max(maxAbs, Math.abs(r.value));\n        }\n        return { min: -maxAbs * 1.2, max: maxAbs * 1.2 };\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        results: IndicatorResult[],\n        scale: ScaleManager,\n        viewport: Viewport,\n        paneHeight: number,\n        rangeOverride?: PriceRange,\n    ): void {\n        const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n            ?? ctx.canvas.width;\n\n        // Dynamic range ±maxAbs*1.2\n        let maxAbs = 0.0001;\n        for (const r of results) {\n            if (r.value != null) maxAbs = Math.max(maxAbs, Math.abs(r.value));\n        }\n        const range = rangeOverride ?? { min: -maxAbs * 1.2, max: maxAbs * 1.2 };\n        const zeroY = scale.yToPixel(0, range, paneHeight);\n\n        // Zero dashed line\n        ctx.save();\n        ctx.setLineDash([4, 4]);\n        ctx.strokeStyle = 'rgba(150,150,150,0.35)';\n        ctx.lineWidth = 1;\n        ctx.beginPath();\n        ctx.moveTo(0, zeroY);\n        ctx.lineTo(chartWidth, zeroY);\n        ctx.stroke();\n        ctx.setLineDash([]);\n        ctx.restore();\n\n        // Histogram bars: green if AO[i] >= AO[i-1], red otherwise (first bar defaults green)\n        const bodyW = Math.max(scale.candleBodyWidth(viewport, chartWidth), 1);\n        let prevValue: number | null = null;\n\n        for (const r of results) {\n            if (r.value == null) { prevValue = null; continue; }\n\n            const isGreen = prevValue === null ? true : r.value >= prevValue;\n            const x    = scale.xToPixel(r.index, viewport, chartWidth);\n            const barY = scale.yToPixel(r.value, range, paneHeight);\n            const h    = Math.abs(barY - zeroY);\n            const top  = Math.min(barY, zeroY);\n\n            ctx.fillStyle = isGreen ? 'rgba(38,166,154,0.70)' : 'rgba(239,83,80,0.70)';\n            ctx.fillRect(x - bodyW / 2, top, bodyW, h);\n\n            prevValue = r.value;\n        }\n\n    }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class HeikinAshi implements IIndicator {\n  readonly name = 'HA';\n  readonly color: string;\n  private readonly upColor: string;\n  private readonly downColor: string;\n\n  constructor(color = '#90a4ae', upColor = '#26a69a', downColor = '#ef5350') {\n    this.color    = color;\n    this.upColor  = upColor;\n    this.downColor = downColor;\n  }\n\n  compute(data: OHLCVBar[]): IndicatorResult[] {\n    const results: IndicatorResult[] = [];\n    let prevHAOpen = 0;\n    let prevHAClose = 0;\n\n    for (let i = 0; i < data.length; i++) {\n      const bar = data[i];\n\n      const haClose = (bar.open + bar.high + bar.low + bar.close) / 4;\n\n      let haOpen: number;\n      if (i === 0) {\n        haOpen = (bar.open + bar.close) / 2;\n      } else {\n        haOpen = (prevHAOpen + prevHAClose) / 2;\n      }\n\n      const haHigh = Math.max(bar.high, haOpen, haClose);\n      const haLow = Math.min(bar.low, haOpen, haClose);\n\n      prevHAOpen = haOpen;\n      prevHAClose = haClose;\n\n      results.push({\n        index: i,\n        value: haClose,   // HA-Close\n        upper: haHigh,    // HA-High\n        lower: haLow,     // HA-Low\n        signal: haOpen,   // HA-Open\n      });\n    }\n\n    return results;\n  }\n\n  render(\n    ctx: CanvasRenderingContext2D,\n    results: IndicatorResult[],\n    scale: ScaleManager,\n    viewport: Viewport,\n    chartHeight: number,\n  ): void {\n    const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n    const priceRange = canvas._priceRange;\n    if (!priceRange) return;\n\n    const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n    const candleWidth = scale.candleBodyWidth(viewport, chartWidth);\n    const halfBody = candleWidth / 2;\n\n    for (const r of results) {\n      if (r.value == null || r.upper == null || r.lower == null || r.signal == null) continue;\n\n      const haClose = r.value;\n      const haHigh = r.upper;\n      const haLow = r.lower;\n      const haOpen = r.signal;\n\n      const isBullish = haClose >= haOpen;\n      const color = isBullish ? this.upColor : this.downColor;\n\n      const x = scale.xToPixel(r.index, viewport, chartWidth);\n      const yHigh = scale.yToPixel(haHigh, priceRange, chartHeight);\n      const yLow = scale.yToPixel(haLow, priceRange, chartHeight);\n      const yOpen = scale.yToPixel(haOpen, priceRange, chartHeight);\n      const yClose = scale.yToPixel(haClose, priceRange, chartHeight);\n\n      const bodyTop = Math.min(yOpen, yClose);\n      const bodyBottom = Math.max(yOpen, yClose);\n      const bodyHeight = Math.max(1, bodyBottom - bodyTop);\n\n      // Draw wick\n      ctx.beginPath();\n      ctx.strokeStyle = color;\n      ctx.lineWidth = 1;\n      ctx.moveTo(x, yHigh);\n      ctx.lineTo(x, yLow);\n      ctx.stroke();\n\n      // Draw body\n      ctx.fillStyle = color;\n      ctx.strokeStyle = color;\n      ctx.lineWidth = 1;\n      ctx.fillRect(x - halfBody, bodyTop, candleWidth, bodyHeight);\n      ctx.strokeRect(x - halfBody, bodyTop, candleWidth, bodyHeight);\n    }\n  }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class VOL implements IIndicator {\n    readonly name = 'VOL';\n    readonly color: string;\n    readonly pane = 'sub' as const;\n    readonly paneHeight = 80;\n\n    private readonly upColor: string;\n    private readonly downColor: string;\n\n    constructor(upColor = '#26a69a', downColor = '#ef5350') {\n        this.upColor = upColor;\n        this.downColor = downColor;\n        this.color = upColor;\n    }\n\n    compute(data: OHLCVBar[]): IndicatorResult[] {\n        return data.map((bar, i) => ({\n            index: i,\n            value: bar.volume ?? 0,\n            // encode direction in signal field for render phase\n            signal: bar.close >= bar.open ? 1 : 0,\n        }));\n    }\n\n    render(\n        ctx: CanvasRenderingContext2D,\n        results: IndicatorResult[],\n        scale: ScaleManager,\n        viewport: Viewport,\n        paneHeight: number,\n    ): void {\n        const chartWidth = (ctx.canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth\n            ?? ctx.canvas.width;\n\n        // Dynamic range from 0 to max volume\n        let maxVol = 0;\n        for (const r of results) {\n            if (r.value != null && r.value > maxVol) maxVol = r.value;\n        }\n        if (maxVol === 0) return;\n\n        const range = { min: 0, max: maxVol * 1.1 };\n        const baseY = scale.yToPixel(0, range, paneHeight);\n        const bodyW = Math.max(scale.candleBodyWidth(viewport, chartWidth), 1);\n\n        for (const r of results) {\n            if (r.value == null || r.value === 0) continue;\n            const x = scale.xToPixel(r.index, viewport, chartWidth);\n            const topY = scale.yToPixel(r.value, range, paneHeight);\n            const h = Math.abs(baseY - topY);\n            ctx.fillStyle = r.signal === 1 ? `${this.upColor}99` : `${this.downColor}99`;\n            ctx.fillRect(x - bodyW / 2, topY, bodyW, h);\n        }\n\n        // Label\n        ctx.fillStyle = this.upColor;\n        ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n        ctx.fillText(this.name, 4, 11);\n    }\n}\n","import type { OHLCVBar, IIndicator, IndicatorResult, Viewport } from '../core/types.js';\nimport type { ScaleManager } from '../core/ScaleManager.js';\n\nexport class LinearRegression implements IIndicator {\n  readonly name: string;\n  readonly color: string;\n\n  constructor(\n    private readonly period = 14,\n    color = '#ff9800',\n  ) {\n    this.name = 'LinReg';\n    this.color = color;\n  }\n\n  compute(data: OHLCVBar[]): IndicatorResult[] {\n    const n = this.period;\n    const results: IndicatorResult[] = [];\n\n    // Precompute constant parts of the regression that depend only on n\n    // x values are 0, 1, ..., n-1\n    const sumX = (n * (n - 1)) / 2;\n    const sumX2 = (n * (n - 1) * (2 * n - 1)) / 6;\n    const denom = n * sumX2 - sumX * sumX;\n\n    for (let i = 0; i < data.length; i++) {\n      if (i < n - 1) {\n        results.push({ index: i, value: null });\n        continue;\n      }\n\n      let sumY = 0;\n      let sumXY = 0;\n      for (let j = 0; j < n; j++) {\n        const close = data[i - (n - 1 - j)].close;\n        sumY += close;\n        sumXY += j * close;\n      }\n\n      const slope = (n * sumXY - sumX * sumY) / denom;\n      const intercept = (sumY - slope * sumX) / n;\n      const value = intercept + slope * (n - 1);\n\n      results.push({ index: i, value });\n    }\n\n    return results;\n  }\n\n  render(\n    ctx: CanvasRenderingContext2D,\n    results: IndicatorResult[],\n    scale: ScaleManager,\n    viewport: Viewport,\n    chartHeight: number,\n  ): void {\n    const canvas = ctx.canvas as HTMLCanvasElement & { _priceRange?: { min: number; max: number } };\n    const priceRange = canvas._priceRange;\n    if (!priceRange) return;\n\n    const chartWidth = (canvas as HTMLCanvasElement & { _chartWidth?: number })._chartWidth ?? ctx.canvas.width;\n\n    ctx.beginPath();\n    ctx.strokeStyle = this.color;\n    ctx.lineWidth = 1.5;\n    ctx.lineJoin = 'round';\n\n    let started = false;\n    for (const r of results) {\n      if (r.value === null) { started = false; continue; }\n      const x = scale.xToPixel(r.index, viewport, chartWidth);\n      const y = scale.yToPixel(r.value, priceRange, chartHeight);\n      started ? ctx.lineTo(x, y) : (ctx.moveTo(x, y), (started = true));\n    }\n\n    ctx.stroke();\n  }\n}\n","[\n    {\n        \"name\": \"Moving Average\",\n        \"short_name\": \"MA\",\n        \"type\": \"Trend\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"Exponential Moving Average\",\n        \"short_name\": \"EMA\",\n        \"type\": \"Trend\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"Weighted Moving Average\",\n        \"short_name\": \"WMA\",\n        \"type\": \"Trend\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"Hull Moving Average\",\n        \"short_name\": \"HMA\",\n        \"type\": \"Trend\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"Moving Average Ribbon\",\n        \"short_name\": \"MARibbon\",\n        \"type\": \"Trend\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"Bollinger Bands\",\n        \"short_name\": \"BB\",\n        \"type\": \"Volatility\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"Keltner Channels\",\n        \"short_name\": \"KC\",\n        \"type\": \"Volatility\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"Donchian Channels\",\n        \"short_name\": \"DC\",\n        \"type\": \"Volatility\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"Average True Range\",\n        \"short_name\": \"ATR\",\n        \"type\": \"Volatility\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"Relative Strength Index\",\n        \"short_name\": \"RSI\",\n        \"type\": \"Momentum\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"Stochastic Oscillator\",\n        \"short_name\": \"Stoch\",\n        \"type\": \"Momentum\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"Stochastic RSI\",\n        \"short_name\": \"StochRSI\",\n        \"type\": \"Momentum\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"MACD\",\n        \"short_name\": \"MACD\",\n        \"type\": \"Momentum\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"Commodity Channel Index\",\n        \"short_name\": \"CCI\",\n        \"type\": \"Momentum\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"Williams %R\",\n        \"short_name\": \"%R\",\n        \"type\": \"Momentum\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"Rate of Change\",\n        \"short_name\": \"ROC\",\n        \"type\": \"Momentum\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"On Balance Volume\",\n        \"short_name\": \"OBV\",\n        \"type\": \"Volume\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"Volume\",\n        \"short_name\": \"VOL\",\n        \"type\": \"Volume\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"Volume Weighted Average Price\",\n        \"short_name\": \"VWAP\",\n        \"type\": \"Volume\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"Accumulation/Distribution\",\n        \"short_name\": \"A/D\",\n        \"type\": \"Volume\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"Money Flow Index\",\n        \"short_name\": \"MFI\",\n        \"type\": \"Volume\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"Chaikin Money Flow\",\n        \"short_name\": \"CMF\",\n        \"type\": \"Volume\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"Pivot Points Standard\",\n        \"short_name\": \"Pivot\",\n        \"type\": \"Support/Resistance\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"Fibonacci Retracement\",\n        \"short_name\": \"Fib\",\n        \"type\": \"Support/Resistance\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"Supertrend\",\n        \"short_name\": \"Supertrend\",\n        \"type\": \"Trend\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"Parabolic SAR\",\n        \"short_name\": \"PSAR\",\n        \"type\": \"Trend\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"Ichimoku Cloud\",\n        \"short_name\": \"Ichimoku\",\n        \"type\": \"Trend\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"ADX\",\n        \"short_name\": \"ADX\",\n        \"type\": \"Trend Strength\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"Awesome Oscillator\",\n        \"short_name\": \"AO\",\n        \"type\": \"Momentum\",\n        \"enabled\": true\n    },\n    {\n        \"name\": \"Heikin Ashi\",\n        \"short_name\": \"HA\",\n        \"type\": \"Price Transformation\",\n        \"enabled\": false\n    },\n    {\n        \"name\": \"Linear Regression\",\n        \"short_name\": \"LinReg\",\n        \"type\": \"Trend\",\n        \"enabled\": true\n    }\n]\n","import type { OHLCVBar } from '../core/types.js';\n\n/**\n * Aggregates an array of fine-grained OHLCV bars into a coarser timeframe.\n *\n * Bars are grouped by time bucket: `Math.floor(bar.time / targetIntervalMs) * targetIntervalMs`.\n * Each bucket produces one output bar:\n *   - open  = first bar's open\n *   - high  = max of all highs\n *   - low   = min of all lows\n *   - close = last bar's close\n *   - volume = sum of all volumes\n *\n * Empty time buckets (weekends, holidays, gaps) are skipped — no phantom bars are created.\n * Partial buckets (e.g. the live/in-progress candle) are included as-is.\n *\n * @param bars            Source bars sorted ascending by time.\n * @param targetIntervalMs Target candle duration in milliseconds.\n * @returns Aggregated bars sorted ascending by time.\n */\nexport function aggregateCandles(bars: OHLCVBar[], targetIntervalMs: number): OHLCVBar[] {\n    if (bars.length === 0 || targetIntervalMs <= 0) return bars;\n\n    const buckets = new Map<number, OHLCVBar[]>();\n\n    for (const bar of bars) {\n        const key = Math.floor(bar.time / targetIntervalMs) * targetIntervalMs;\n        const group = buckets.get(key);\n        if (group) {\n            group.push(bar);\n        } else {\n            buckets.set(key, [bar]);\n        }\n    }\n\n    const result: OHLCVBar[] = [];\n\n    for (const [bucketTime, group] of buckets) {\n        let high = group[0].high;\n        let low = group[0].low;\n        let volume = 0;\n        for (const b of group) {\n            if (b.high > high) high = b.high;\n            if (b.low < low) low = b.low;\n            volume += b.volume ?? 0;\n        }\n        result.push({\n            time:   bucketTime,\n            open:   group[0].open,\n            high,\n            low,\n            close:  group[group.length - 1].close,\n            volume,\n        });\n    }\n\n    result.sort((a, b) => a.time - b.time);\n    return result;\n}\n","import actLogoUrl from '../act.svg';\nimport { DataStore } from './core/DataStore.js';\nimport { ScaleManager } from './core/ScaleManager.js';\nimport { EventEmitter } from './core/EventEmitter.js';\nimport { DARK_THEME, LIGHT_THEME, deepMergeTheme, resolveCssVarsInTheme } from './core/themes.js';\nimport type { ChartTheme, DeepPartialChartTheme } from './core/themes.js';\nimport { resolveUiConfig, type UiConfig } from './core/uiConfig.js';\nimport { resolveLabels, type ChartLabels } from './core/labels.js';\nimport { PanHandler } from './interaction/PanHandler.js';\nimport type { MomentumOptions } from './interaction/PanHandler.js';\nimport { ZoomHandler } from './interaction/ZoomHandler.js';\nimport { renderCandlestick } from './series/CandlestickSeries.js';\nimport { renderHollowCandle } from './series/HollowCandleSeries.js';\nimport { renderLine } from './series/LineSeries.js';\nimport { renderOHLC } from './series/OHLCSeries.js';\nimport { renderVolume } from './series/VolumeSeries.js';\nimport { renderHeikinAshi } from './series/HeikinAshiSeries.js';\nimport { renderVolumeCandles } from './series/VolumeCandles.js';\nimport { renderLineWithMarkers } from './series/LineWithMarkers.js';\nimport { renderStepLine } from './series/StepLineSeries.js';\nimport { renderHLCArea } from './series/HLCAreaSeries.js';\nimport { renderBaseline } from './series/BaselineSeries.js';\nimport { renderColumns } from './series/ColumnSeries.js';\nimport { renderHighLow } from './series/HighLowSeries.js';\nimport { renderGrid } from './overlays/GridOverlay.js';\nimport { renderCrosshair } from './overlays/CrosshairOverlay.js';\nimport {\n    renderTradeLevels,\n    renderPositionAxisTags,\n    hitTestTradeLevelClose,\n    hitTestTradeLevelEdit,\n    hitTestTradeLevelHover,\n    hitTestTradeLevelDrag,\n    hitTestTradeLevelConfirm,\n    hitTestTradeLevelAddBracket,\n    hitTestClusterBadge,\n    type TradeLevelHitArea,\n    type TradeHoverArea,\n    type AnyDragArea,\n    type TradeLevelDragArea,\n    type TradeLevelConfirmArea,\n    type TradeAddBracketArea,\n    type ClusterBadgeHitArea,\n    type LevelCluster,\n} from './overlays/TradeLevelOverlay.js';\nimport {\n    renderOffViewportIndicators,\n    hitTestOffViewportIndicator,\n    overlapsOffViewportPill,\n    type OffViewportHitArea,\n} from './overlays/OffViewportLevelIndicator.js';\nimport { renderTimeAxis, renderCandleCountdown, renderPriceAxisCountdown } from './axis/TimeAxis.js';\nimport { renderPriceAxis } from './axis/PriceAxis.js';\nimport { TopBar } from './ui/TopBar.js';\nimport { iconScrollToEnd, iconResetView, ICON_TRASH, ICON_CLOSE } from './ui/icons.js';\nimport { BottomBar, DURATION_TIMEFRAME_MAP } from './ui/BottomBar.js';\nimport { LeftBar } from './ui/LeftBar.js';\nimport { DrawingManager } from './drawings/DrawingManager.js';\nimport { IndicatorOverlay } from './ui/IndicatorOverlay.js';\nimport { IndicatorSettingsDialog } from './ui/IndicatorSettingsDialog.js';\nimport { ChartSettingsDialog, type ChartSettings } from './ui/ChartSettingsDialog.js';\nimport { TradeButton } from './ui/TradeButton.js';\nimport { TradePopover } from './ui/TradePopover.js';\nimport { DrawingStylePopover } from './ui/DrawingStylePopover.js';\nimport { DraftQtyFlyout } from './ui/DraftQtyFlyout.js';\nimport { IsinPickerModal } from './ui/IsinPickerModal.js';\nimport { enableKeyboardOverlayMode } from './ui/keyboardAware.js';\nimport { TradeDragHandler } from './interaction/TradeDragHandler.js';\nimport { SMA } from './indicators/SMA.js';\nimport { EMA } from './indicators/EMA.js';\nimport { WMA } from './indicators/WMA.js';\nimport { HMA } from './indicators/HMA.js';\nimport { MARibbon } from './indicators/MARibbon.js';\nimport { BollingerBands } from './indicators/BollingerBands.js';\nimport { KeltnerChannels } from './indicators/KeltnerChannels.js';\nimport { DonchianChannels } from './indicators/DonchianChannels.js';\nimport { ATR } from './indicators/ATR.js';\nimport { RSI } from './indicators/RSI.js';\nimport { Stochastic } from './indicators/Stochastic.js';\nimport { StochRSI } from './indicators/StochRSI.js';\nimport { MACD } from './indicators/MACD.js';\nimport { CCI } from './indicators/CCI.js';\nimport { WilliamsR } from './indicators/WilliamsR.js';\nimport { ROC } from './indicators/ROC.js';\nimport { OBV } from './indicators/OBV.js';\nimport { VWAP } from './indicators/VWAP.js';\nimport { AccDistribution } from './indicators/AccDistribution.js';\nimport { MFI } from './indicators/MFI.js';\nimport { CMF } from './indicators/CMF.js';\nimport { PivotPoints } from './indicators/PivotPoints.js';\nimport { FibRetracementIndicator } from './indicators/FibRetracementIndicator.js';\nimport { Supertrend } from './indicators/Supertrend.js';\nimport { ParabolicSAR } from './indicators/ParabolicSAR.js';\nimport { IchimokuCloud } from './indicators/IchimokuCloud.js';\nimport { ADX } from './indicators/ADX.js';\nimport { AwesomeOscillator } from './indicators/AwesomeOscillator.js';\nimport { HeikinAshi } from './indicators/HeikinAshi.js';\nimport { VOL } from './indicators/VOL.js';\nimport { LinearRegression } from './indicators/LinearRegression.js';\nimport INDICATORS_CONFIG from './core/indicators.json';\nimport type { IndicatorParamSchema, ParamFieldDef } from './core/indicatorSettings.js';\nimport type { PriceSource } from './indicators/sourceField.js';\nimport { aggregateCandles } from './utils/aggregateCandles.js';\n\nimport type {\n    OHLCVBar,\n    ChartConfig,\n    DataLoaderParams,\n    IIndicator,\n    IWebSocketAdapter,\n    Viewport,\n    PriceRange,\n    CrosshairPosition,\n    ChartEventMap,\n    SeriesType,\n    Timeframe,\n    Duration,\n    DrawingToolType,\n    DrawingPoint,\n    Tick,\n    IndicatorParams,\n    ActiveIndicatorState,\n    StreamStatus,\n    PositionLevel,\n    PendingOrderLevel,\n    AnyLevel,\n    TradeLevelType,\n    TradeDisplayFilter,\n    PositionRenderStyle,\n    OrderSubmit,\n    ChartState,\n    AnyDrawingStyle,\n} from './core/types.js';\n\n// ── Built-in indicator presets (keyed by short_name matching indicators.json) ─\nconst INDICATOR_PRESETS: { shortName: string; factory: () => IIndicator }[] = [\n    // Trend\n    { shortName: 'MA', factory: () => new SMA(20) },\n    { shortName: 'EMA', factory: () => new EMA(20) },\n    { shortName: 'WMA', factory: () => new WMA(20) },\n    { shortName: 'HMA', factory: () => new HMA(20) },\n    { shortName: 'MARibbon', factory: () => new MARibbon() },\n    // Volatility\n    { shortName: 'BB', factory: () => new BollingerBands(20, 2) },\n    { shortName: 'KC', factory: () => new KeltnerChannels(20, 2) },\n    { shortName: 'DC', factory: () => new DonchianChannels(20) },\n    { shortName: 'ATR', factory: () => new ATR(14) },\n    // Momentum\n    { shortName: 'RSI', factory: () => new RSI(14) },\n    { shortName: 'Stoch', factory: () => new Stochastic(14, 3) },\n    { shortName: 'StochRSI', factory: () => new StochRSI(14, 14, 3, 3) },\n    { shortName: 'MACD', factory: () => new MACD(12, 26, 9) },\n    { shortName: 'CCI', factory: () => new CCI(20) },\n    { shortName: '%R', factory: () => new WilliamsR(14) },\n    { shortName: 'ROC', factory: () => new ROC(12) },\n    { shortName: 'AO', factory: () => new AwesomeOscillator() },\n    // Volume\n    { shortName: 'OBV', factory: () => new OBV() },\n    { shortName: 'VWAP', factory: () => new VWAP() },\n    { shortName: 'A/D', factory: () => new AccDistribution() },\n    { shortName: 'MFI', factory: () => new MFI(14) },\n    { shortName: 'CMF', factory: () => new CMF(20) },\n    // Support / Resistance\n    { shortName: 'Pivot', factory: () => new PivotPoints() },\n    { shortName: 'Fib', factory: () => new FibRetracementIndicator(50) },\n    // Trend (overlay)\n    { shortName: 'Supertrend', factory: () => new Supertrend(10, 3) },\n    { shortName: 'PSAR', factory: () => new ParabolicSAR(0.02, 0.2) },\n    { shortName: 'Ichimoku', factory: () => new IchimokuCloud(9, 26, 52) },\n    // Trend Strength\n    { shortName: 'ADX', factory: () => new ADX(14) },\n    // Price Transformation\n    { shortName: 'HA', factory: () => new HeikinAshi() },\n    // Volume (sub-pane)\n    { shortName: 'VOL', factory: () => new VOL() },\n    // Trend (overlay)\n    { shortName: 'LinReg', factory: () => new LinearRegression(14) },\n];\n\n// ── Common timeframe lock field injected into every indicator's settings ────────\nconst TIMEFRAME_FIELD: ParamFieldDef = {\n    kind: 'select',\n    key: 'timeframe',\n    label: 'Timeframe',\n    options: ['Chart', '1m', '5m', '15m', '30m', '1h', '2h', '4h', '8h', '1D', '1W', '1M'],\n    default: 'Chart',\n};\n\n// ── Builds a display label like \"RSI(14)\" or \"MACD(12, 26, 9)\" ────────────────\nfunction buildIndicatorLabel(\n    shortName: string,\n    params: IndicatorParams,\n    schema: IndicatorParamSchema | undefined\n): string {\n    if (!schema) return shortName;\n    const nums = schema.fields\n        .filter((f) => f.kind === 'number')\n        .map((f) => params[f.key] ?? f.default);\n    return nums.length > 0 ? `${shortName}(${nums.join(', ')})` : shortName;\n}\n\n// ── Indicator param schemas (define editable fields per indicator) ─────────────\nconst INDICATOR_PARAM_SCHEMAS: IndicatorParamSchema[] = [\n    // Trend\n    {\n        shortName: 'MA',\n        fields: [\n            {\n                kind: 'number',\n                key: 'period',\n                label: 'Period',\n                min: 1,\n                max: 500,\n                step: 1,\n                default: 20,\n            },\n            { kind: 'color', key: 'color', label: 'Color', default: '#F5A623' },\n            {\n                kind: 'select',\n                key: 'source',\n                label: 'Source',\n                options: ['open', 'high', 'low', 'close'],\n                default: 'close',\n            },\n        ],\n        factory: (p) =>\n            new SMA(p.period as number, p.color as string, 'MA', p.source as PriceSource),\n    },\n    {\n        shortName: 'EMA',\n        fields: [\n            {\n                kind: 'number',\n                key: 'period',\n                label: 'Period',\n                min: 1,\n                max: 500,\n                step: 1,\n                default: 20,\n            },\n            { kind: 'color', key: 'color', label: 'Color', default: '#9B59B6' },\n            {\n                kind: 'select',\n                key: 'source',\n                label: 'Source',\n                options: ['open', 'high', 'low', 'close'],\n                default: 'close',\n            },\n        ],\n        factory: (p) =>\n            new EMA(p.period as number, p.color as string, 'EMA', p.source as PriceSource),\n    },\n    {\n        shortName: 'WMA',\n        fields: [\n            {\n                kind: 'number',\n                key: 'period',\n                label: 'Period',\n                min: 1,\n                max: 500,\n                step: 1,\n                default: 20,\n            },\n            { kind: 'color', key: 'color', label: 'Color', default: '#e91e63' },\n            {\n                kind: 'select',\n                key: 'source',\n                label: 'Source',\n                options: ['open', 'high', 'low', 'close'],\n                default: 'close',\n            },\n        ],\n        factory: (p) =>\n            new WMA(p.period as number, p.color as string, 'WMA', p.source as PriceSource),\n    },\n    {\n        shortName: 'HMA',\n        fields: [\n            {\n                kind: 'number',\n                key: 'period',\n                label: 'Period',\n                min: 1,\n                max: 500,\n                step: 1,\n                default: 20,\n            },\n            { kind: 'color', key: 'color', label: 'Color', default: '#00bcd4' },\n            {\n                kind: 'select',\n                key: 'source',\n                label: 'Source',\n                options: ['open', 'high', 'low', 'close'],\n                default: 'close',\n            },\n        ],\n        factory: (p) =>\n            new HMA(p.period as number, p.color as string, 'HMA', p.source as PriceSource),\n    },\n    {\n        shortName: 'MARibbon',\n        fields: [\n            { kind: 'color', key: 'color', label: 'Color', default: '#ffcc80' },\n            {\n                kind: 'select',\n                key: 'source',\n                label: 'Source',\n                options: ['open', 'high', 'low', 'close'],\n                default: 'close',\n            },\n        ],\n        factory: (p) => new MARibbon(p.color as string, p.source as PriceSource),\n    },\n    // Volatility\n    {\n        shortName: 'BB',\n        fields: [\n            {\n                kind: 'number',\n                key: 'period',\n                label: 'Period',\n                min: 1,\n                max: 500,\n                step: 1,\n                default: 20,\n            },\n            {\n                kind: 'number',\n                key: 'stdDev',\n                label: 'Std Dev',\n                min: 0.1,\n                max: 10,\n                step: 0.1,\n                default: 2,\n            },\n            { kind: 'color', key: 'color', label: 'Color', default: '#3B82F6' },\n            {\n                kind: 'select',\n                key: 'source',\n                label: 'Source',\n                options: ['open', 'high', 'low', 'close'],\n                default: 'close',\n            },\n        ],\n        factory: (p) =>\n            new BollingerBands(\n                p.period as number,\n                p.stdDev as number,\n                p.color as string,\n                'BB',\n                p.source as PriceSource\n            ),\n    },\n    {\n        shortName: 'KC',\n        fields: [\n            {\n                kind: 'number',\n                key: 'period',\n                label: 'Period',\n                min: 1,\n                max: 500,\n                step: 1,\n                default: 20,\n            },\n            {\n                kind: 'number',\n                key: 'mult',\n                label: 'Multiplier',\n                min: 0.1,\n                max: 10,\n                step: 0.1,\n                default: 2,\n            },\n            {\n                kind: 'number',\n                key: 'atrPeriod',\n                label: 'ATR Period',\n                min: 1,\n                max: 500,\n                step: 1,\n                default: 10,\n            },\n            { kind: 'color', key: 'color', label: 'Color', default: '#4caf50' },\n        ],\n        factory: (p) =>\n            new KeltnerChannels(\n                p.period as number,\n                p.mult as number,\n                p.atrPeriod as number,\n                p.color as string\n            ),\n    },\n    {\n        shortName: 'DC',\n        fields: [\n            {\n                kind: 'number',\n                key: 'period',\n                label: 'Period',\n                min: 1,\n                max: 500,\n                step: 1,\n                default: 20,\n            },\n            { kind: 'color', key: 'color', label: 'Color', default: '#26c6da' },\n        ],\n        factory: (p) => new DonchianChannels(p.period as number, p.color as string),\n    },\n    {\n        shortName: 'ATR',\n        fields: [\n            {\n                kind: 'number',\n                key: 'period',\n                label: 'Period',\n                min: 1,\n                max: 500,\n                step: 1,\n                default: 14,\n            },\n            { kind: 'color', key: 'color', label: 'Color', default: '#ff5722' },\n        ],\n        factory: (p) => new ATR(p.period as number, p.color as string),\n    },\n    // Momentum\n    {\n        shortName: 'RSI',\n        fields: [\n            {\n                kind: 'number',\n                key: 'period',\n                label: 'Period',\n                min: 1,\n                max: 500,\n                step: 1,\n                default: 14,\n            },\n            { kind: 'color', key: 'color', label: 'Color', default: '#e8b84b' },\n            {\n                kind: 'select',\n                key: 'source',\n                label: 'Source',\n                options: ['open', 'high', 'low', 'close'],\n                default: 'close',\n            },\n        ],\n        factory: (p) =>\n            new RSI(p.period as number, p.color as string, 'RSI', p.source as PriceSource),\n    },\n    {\n        shortName: 'Stoch',\n        fields: [\n            {\n                kind: 'number',\n                key: 'kPeriod',\n                label: 'K Period',\n                min: 1,\n                max: 500,\n                step: 1,\n                default: 14,\n            },\n            {\n                kind: 'number',\n                key: 'dPeriod',\n                label: 'D Period',\n                min: 1,\n                max: 100,\n                step: 1,\n                default: 3,\n            },\n            { kind: 'color', key: 'color', label: 'Color', default: '#e040fb' },\n        ],\n        factory: (p) => new Stochastic(p.kPeriod as number, p.dPeriod as number, p.color as string),\n    },\n    {\n        shortName: 'StochRSI',\n        fields: [\n            {\n                kind: 'number',\n                key: 'rsiPeriod',\n                label: 'RSI Period',\n                min: 1,\n                max: 500,\n                step: 1,\n                default: 14,\n            },\n            {\n                kind: 'number',\n                key: 'stochPeriod',\n                label: 'Stoch Period',\n                min: 1,\n                max: 500,\n                step: 1,\n                default: 14,\n            },\n            {\n                kind: 'number',\n                key: 'kPeriod',\n                label: 'K Smooth',\n                min: 1,\n                max: 100,\n                step: 1,\n                default: 3,\n            },\n            {\n                kind: 'number',\n                key: 'dPeriod',\n                label: 'D Smooth',\n                min: 1,\n                max: 100,\n                step: 1,\n                default: 3,\n            },\n            { kind: 'color', key: 'color', label: 'Color', default: '#00e5ff' },\n        ],\n        factory: (p) =>\n            new StochRSI(\n                p.rsiPeriod as number,\n                p.stochPeriod as number,\n                p.kPeriod as number,\n                p.dPeriod as number,\n                p.color as string\n            ),\n    },\n    {\n        shortName: 'MACD',\n        fields: [\n            {\n                kind: 'number',\n                key: 'fast',\n                label: 'Fast Period',\n                min: 1,\n                max: 500,\n                step: 1,\n                default: 12,\n            },\n            {\n                kind: 'number',\n                key: 'slow',\n                label: 'Slow Period',\n                min: 1,\n                max: 500,\n                step: 1,\n                default: 26,\n            },\n            {\n                kind: 'number',\n                key: 'signal',\n                label: 'Signal Period',\n                min: 1,\n                max: 100,\n                step: 1,\n                default: 9,\n            },\n            { kind: 'color', key: 'color', label: 'Color', default: '#2196f3' },\n            {\n                kind: 'select',\n                key: 'source',\n                label: 'Source',\n                options: ['open', 'high', 'low', 'close'],\n                default: 'close',\n            },\n        ],\n        factory: (p) =>\n            new MACD(\n                p.fast as number,\n                p.slow as number,\n                p.signal as number,\n                p.color as string,\n                'MACD',\n                p.source as PriceSource\n            ),\n    },\n    {\n        shortName: 'CCI',\n        fields: [\n            {\n                kind: 'number',\n                key: 'period',\n                label: 'Period',\n                min: 1,\n                max: 500,\n                step: 1,\n                default: 20,\n            },\n            { kind: 'color', key: 'color', label: 'Color', default: '#4db6ac' },\n        ],\n        factory: (p) => new CCI(p.period as number, p.color as string),\n    },\n    {\n        shortName: '%R',\n        fields: [\n            {\n                kind: 'number',\n                key: 'period',\n                label: 'Period',\n                min: 1,\n                max: 500,\n                step: 1,\n                default: 14,\n            },\n            { kind: 'color', key: 'color', label: 'Color', default: '#ff7043' },\n        ],\n        factory: (p) => new WilliamsR(p.period as number, p.color as string),\n    },\n    {\n        shortName: 'ROC',\n        fields: [\n            {\n                kind: 'number',\n                key: 'period',\n                label: 'Period',\n                min: 1,\n                max: 500,\n                step: 1,\n                default: 12,\n            },\n            { kind: 'color', key: 'color', label: 'Color', default: '#80cbc4' },\n            {\n                kind: 'select',\n                key: 'source',\n                label: 'Source',\n                options: ['open', 'high', 'low', 'close'],\n                default: 'close',\n            },\n        ],\n        factory: (p) => new ROC(p.period as number, p.color as string, p.source as PriceSource),\n    },\n    {\n        shortName: 'AO',\n        fields: [\n            {\n                kind: 'number',\n                key: 'fastPeriod',\n                label: 'Fast Period',\n                min: 1,\n                max: 100,\n                step: 1,\n                default: 5,\n            },\n            {\n                kind: 'number',\n                key: 'slowPeriod',\n                label: 'Slow Period',\n                min: 1,\n                max: 200,\n                step: 1,\n                default: 34,\n            },\n            { kind: 'color', key: 'color', label: 'Color', default: '#b0bec5' },\n        ],\n        factory: (p) =>\n            new AwesomeOscillator(\n                p.fastPeriod as number,\n                p.slowPeriod as number,\n                p.color as string\n            ),\n    },\n    // Volume\n    {\n        shortName: 'OBV',\n        fields: [{ kind: 'color', key: 'color', label: 'Color', default: '#aed581' }],\n        factory: (p) => new OBV(p.color as string),\n    },\n    {\n        shortName: 'VWAP',\n        fields: [{ kind: 'color', key: 'color', label: 'Color', default: '#9c27b0' }],\n        factory: (p) => new VWAP(p.color as string),\n    },\n    {\n        shortName: 'A/D',\n        fields: [{ kind: 'color', key: 'color', label: 'Color', default: '#ce93d8' }],\n        factory: (p) => new AccDistribution(p.color as string),\n    },\n    {\n        shortName: 'MFI',\n        fields: [\n            {\n                kind: 'number',\n                key: 'period',\n                label: 'Period',\n                min: 1,\n                max: 500,\n                step: 1,\n                default: 14,\n            },\n            { kind: 'color', key: 'color', label: 'Color', default: '#ffab40' },\n        ],\n        factory: (p) => new MFI(p.period as number, p.color as string),\n    },\n    {\n        shortName: 'CMF',\n        fields: [\n            {\n                kind: 'number',\n                key: 'period',\n                label: 'Period',\n                min: 1,\n                max: 500,\n                step: 1,\n                default: 20,\n            },\n            { kind: 'color', key: 'color', label: 'Color', default: '#80deea' },\n        ],\n        factory: (p) => new CMF(p.period as number, p.color as string),\n    },\n    // Support / Resistance\n    {\n        shortName: 'Pivot',\n        fields: [{ kind: 'color', key: 'color', label: 'Color', default: '#ffd54f' }],\n        factory: (p) => new PivotPoints(p.color as string),\n    },\n    {\n        shortName: 'Fib',\n        fields: [\n            {\n                kind: 'number',\n                key: 'lookback',\n                label: 'Lookback',\n                min: 1,\n                max: 500,\n                step: 1,\n                default: 50,\n            },\n            { kind: 'color', key: 'color', label: 'Color', default: '#e1bee7' },\n        ],\n        factory: (p) => new FibRetracementIndicator(p.lookback as number, p.color as string),\n    },\n    // Trend (overlay)\n    {\n        shortName: 'Supertrend',\n        fields: [\n            {\n                kind: 'number',\n                key: 'atrPeriod',\n                label: 'ATR Period',\n                min: 1,\n                max: 500,\n                step: 1,\n                default: 10,\n            },\n            {\n                kind: 'number',\n                key: 'multiplier',\n                label: 'Multiplier',\n                min: 0.1,\n                max: 20,\n                step: 0.1,\n                default: 3,\n            },\n            { kind: 'color', key: 'color', label: 'Color', default: '#26a69a' },\n        ],\n        factory: (p) =>\n            new Supertrend(p.atrPeriod as number, p.multiplier as number, p.color as string),\n    },\n    {\n        shortName: 'PSAR',\n        fields: [\n            {\n                kind: 'number',\n                key: 'step',\n                label: 'Step',\n                min: 0.001,\n                max: 0.1,\n                step: 0.001,\n                default: 0.02,\n            },\n            {\n                kind: 'number',\n                key: 'maxAF',\n                label: 'Max AF',\n                min: 0.01,\n                max: 1,\n                step: 0.01,\n                default: 0.2,\n            },\n            { kind: 'color', key: 'color', label: 'Color', default: '#ff6b9d' },\n        ],\n        factory: (p) => new ParabolicSAR(p.step as number, p.maxAF as number, p.color as string),\n    },\n    {\n        shortName: 'Ichimoku',\n        fields: [\n            {\n                kind: 'number',\n                key: 'tenkan',\n                label: 'Tenkan Period',\n                min: 1,\n                max: 100,\n                step: 1,\n                default: 9,\n            },\n            {\n                kind: 'number',\n                key: 'kijun',\n                label: 'Kijun Period',\n                min: 1,\n                max: 200,\n                step: 1,\n                default: 26,\n            },\n            {\n                kind: 'number',\n                key: 'senkouB',\n                label: 'Senkou B Period',\n                min: 1,\n                max: 500,\n                step: 1,\n                default: 52,\n            },\n            { kind: 'color', key: 'color', label: 'Color', default: '#b0bec5' },\n        ],\n        factory: (p) =>\n            new IchimokuCloud(\n                p.tenkan as number,\n                p.kijun as number,\n                p.senkouB as number,\n                p.color as string\n            ),\n    },\n    // Trend Strength\n    {\n        shortName: 'ADX',\n        fields: [\n            {\n                kind: 'number',\n                key: 'period',\n                label: 'Period',\n                min: 1,\n                max: 500,\n                step: 1,\n                default: 14,\n            },\n            { kind: 'color', key: 'color', label: 'Color', default: '#fff176' },\n        ],\n        factory: (p) => new ADX(p.period as number, p.color as string),\n    },\n    // Price Transformation\n    {\n        shortName: 'HA',\n        fields: [\n            { kind: 'color', key: 'color', label: 'Color', default: '#90a4ae' },\n            { kind: 'color', key: 'upColor', label: 'Up Color', default: '#26a69a' },\n            { kind: 'color', key: 'downColor', label: 'Down Color', default: '#ef5350' },\n        ],\n        factory: (p) =>\n            new HeikinAshi(p.color as string, p.upColor as string, p.downColor as string),\n    },\n    // Volume (sub-pane)\n    {\n        shortName: 'VOL',\n        fields: [\n            { kind: 'color', key: 'upColor', label: 'Up Color', default: '#26a69a' },\n            { kind: 'color', key: 'downColor', label: 'Down Color', default: '#ef5350' },\n        ],\n        factory: (p) => new VOL(p.upColor as string, p.downColor as string),\n    },\n    // Trend (overlay)\n    {\n        shortName: 'LinReg',\n        fields: [\n            {\n                kind: 'number',\n                key: 'period',\n                label: 'Period',\n                min: 1,\n                max: 500,\n                step: 1,\n                default: 14,\n            },\n            { kind: 'color', key: 'color', label: 'Color', default: '#ff9800' },\n        ],\n        factory: (p) => new LinearRegression(p.period as number, p.color as string),\n    },\n];\n\n// ── Layout constants ──────────────────────────────────────────────────────────\nconst PRICE_AXIS_WIDTH = 70;\nconst TIME_AXIS_HEIGHT = 24;\nconst VOLUME_PANEL_RATIO = 0.18;\nconst SUB_PANE_HEIGHT = 80;\nconst PANE_SEPARATOR = 1; // px — thin line between panes\nconst DEFAULT_VISIBLE_BARS = 80;\nconst DEFAULT_CANDLE_SLOT_WIDTH = 10; // px — target slot width used for auto-calculating initial visible bars\nconst PRICE_RANGE_LERP = 0.25; // lerp fraction per frame; converges in ~10 frames at 60fps\nconst VIEWPORT_LERP = 0.2; // lerp fraction per frame for horizontal pan/zoom smoothing\nfunction isMobileDevice(): boolean {\n    return (\n        typeof window !== 'undefined' && ('ontouchstart' in window || navigator.maxTouchPoints > 1)\n    );\n}\nfunction initialVisibleBars(\n    mobileBarDivisor: number = 2,\n    forceApply = false,\n    defaultBars = DEFAULT_VISIBLE_BARS,\n    defaultMobileBars?: number,\n    chartWidth?: number,\n    targetCandleSlotWidth?: number\n): number {\n    // Auto-calculate from canvas width when the caller has not set an explicit bar count\n    if (chartWidth && chartWidth > 0 && targetCandleSlotWidth && targetCandleSlotWidth > 0) {\n        const auto = Math.floor(chartWidth / targetCandleSlotWidth);\n        return Math.max(10, Math.min(500, auto));\n    }\n    if (!forceApply && !isMobileDevice()) return defaultBars;\n    if (defaultMobileBars !== undefined) return defaultMobileBars;\n    return Math.max(10, Math.round(defaultBars / mobileBarDivisor));\n}\nconst LOOKAHEAD = 4; // empty candle slots to show after the last bar\n\n// ── Sub-pane helpers ──────────────────────────────────────────────────────────\nfunction applySubPaneScale(\n    range: { min: number; max: number },\n    factor: number\n): { min: number; max: number } {\n    const mid = (range.min + range.max) / 2;\n    const half = (range.max - range.min) / 2;\n    return { min: mid - half * factor, max: mid + half * factor };\n}\n\nfunction subPaneAxisPrecision(range: { min: number; max: number }): number {\n    const span = range.max - range.min;\n    if (span >= 100) return 0;\n    if (span >= 10) return 1;\n    if (span >= 1) return 2;\n    if (span >= 0.1) return 3;\n    return 4;\n}\n\n// ── Canvas tag ────────────────────────────────────────────────────────────────\ntype TaggedCanvas = HTMLCanvasElement & {\n    _priceRange?: { min: number; max: number };\n    _chartWidth?: number;\n};\n\nexport class ChartEngine {\n    // DOM\n    private wrapper: HTMLDivElement;\n    private canvasWrap: HTMLDivElement;\n    private canvas: HTMLCanvasElement;\n    private drawCanvas: HTMLCanvasElement;\n    private ctx: CanvasRenderingContext2D;\n    private drawCtx: CanvasRenderingContext2D;\n    // UI bars\n    private topBar: TopBar | null = null;\n    private bottomBar: BottomBar | null = null;\n    private leftBar: LeftBar | null = null;\n    private leftBarVisible = true;\n    private drawingToolsEnabled = true;\n    private settingsEnabled = true;\n    private fullscreenEnabled = true;\n    private _mobileLayout = false;\n    private indicatorOverlay: IndicatorOverlay | null = null;\n    private subPaneOverlays = new Map<string, IndicatorOverlay>();\n    // ISIN picker modal\n    private isinPickerModal: IsinPickerModal | null = null;\n    private isins: string[] = [];\n    // Symbol info overlay (top-left of chart canvas)\n    private siEl: HTMLDivElement | null = null;\n    private siStreamDot: HTMLSpanElement | null = null;\n    private siSymbolSpan: HTMLSpanElement | null = null;\n    private siOHLCSpan: HTMLSpanElement | null = null;\n    private siOHLC2Span: HTMLSpanElement | null = null;\n    private tickActivityTimer: ReturnType<typeof setTimeout> | null = null;\n    private tickActivityMs = 30_000;\n    private streamStatus: StreamStatus = 'disconnected';\n    // Set by destroy() so late-firing callbacks (ResizeObserver entries queued\n    // before disconnect, in-flight promises, sockets) bail before touching state.\n    private _isDestroyed = false;\n    private indicatorSettingsDialog: IndicatorSettingsDialog | null = null;\n    private chartSettingsDialog: ChartSettingsDialog | null = null;\n    private tradeButton: TradeButton | null = null;\n    private tradePopover: TradePopover | null = null;\n    private drawingStylePopover: DrawingStylePopover | null = null;\n    private draftOrderLabel: string | null = null;\n    private _minLots = 1;\n    private _showQuantityField = false;\n    private _qtyFieldMin = 1;\n    private _qtyFieldMax = 100;\n    private _draftQtyFlyout: DraftQtyFlyout | null = null;\n    private _draftQtyPillArea: import('./overlays/TradeLevelOverlay.js').DraftQtyPillArea | undefined = undefined;\n    private _activeQtyPillLabel: string | undefined = undefined;\n    private pendingQtyChanges = new Map<string, number>();\n    private originalQtyByLabel = new Map<string, number | undefined>();\n    private _onOrderSubmit: ((order: OrderSubmit) => void) | undefined = undefined;\n    private scrollToEndBtn: HTMLButtonElement | null = null;\n    private scrollToEndVisible = false;\n    private scrollAnimId: number | null = null;\n    private resetViewBtn: HTMLButtonElement | null = null;\n    private resetViewVisible = false;\n    private _defaultVisibleBars = DEFAULT_VISIBLE_BARS;\n    // Core\n    private dataStore = new DataStore();\n    private scaleManager = new ScaleManager();\n    private emitter = new EventEmitter<ChartEventMap>();\n    private theme: ChartTheme;\n    private themeName: 'dark' | 'light' = 'dark';\n    private _debug = false;\n    private series: SeriesType;\n    private showVolume: boolean;\n    private symbol: string = '';\n    private showBidAskLines = false;\n    private showActLogo = false;\n    private hideLevelConfirmCancel = false;\n    private deselectActiveOnOutsideClick = false;\n    private tradeLevelButtonScale = 1;\n    private levelClusteringEnabled = true;\n    private clusterThresholdDistance = 20;\n    private enableThemeToggle = false;\n    private timeframe: Timeframe;\n    private duration: Duration | undefined;\n    private activeIndicators: ActiveIndicatorState[] = [];\n    private get indicators(): IIndicator[] {\n        return this.activeIndicators\n            .filter((s) => {\n                if (!s.visible) return false;\n                const tf = s.currentParams['timeframe'] as string | undefined;\n                if (tf && tf !== 'Chart' && tf !== this.timeframe) return false;\n                return true;\n            })\n            .map((s) => s.indicator);\n    }\n    private indicatorResults = new Map<string, ReturnType<IIndicator['compute']>>();\n    private viewport: Viewport = {\n        startIndex: 0,\n        endIndex: initialVisibleBars(),\n        candleWidth: 8,\n        candleGap: 2,\n    };\n    // Logical target viewport — pan/zoom handlers write here; `viewport` lerps toward it each frame.\n    private _targetViewport: Viewport = {\n        startIndex: 0,\n        endIndex: initialVisibleBars(),\n        candleWidth: 8,\n        candleGap: 2,\n    };\n    private _isPanning = false;\n    private crosshair: CrosshairPosition | null = null;\n    // Drawing\n    private drawingManager = new DrawingManager();\n    private textInputEl: HTMLInputElement | null = null;\n    private textInputDrawing: import('./core/types.js').IDrawing | null = null;\n    /** Pending drag — committed only after mouse moves past DRAW_GESTURE_THRESHOLD. */\n    private _pendingDrawDrag: {\n        drawing: import('./core/types.js').IDrawing;\n        startX: number;\n        startY: number;\n    } | null = null;\n    /** Pending resize — committed only after mouse moves past DRAW_GESTURE_THRESHOLD. */\n    private _pendingDrawResize: {\n        drawing: import('./core/types.js').IDrawing;\n        pointIndex: number;\n        startX: number;\n        startY: number;\n    } | null = null;\n    private static readonly DRAW_GESTURE_THRESHOLD = 4; // px\n    /**\n     * Pending trade-level drag — committed only after mouse moves past TRADE_DRAG_PIXEL_THRESHOLD.\n     * A mouseup before the threshold means it was a click: route to _openTradeLevelEditForm instead\n     * of finishing a zero-delta drag (which would otherwise stage a spurious pending change).\n     */\n    private _pendingTradeDrag: {\n        dragHit: AnyDragArea;\n        level: AnyLevel;\n        hitY: number;\n        startX: number;\n        startY: number;\n    } | null = null;\n    private static readonly TRADE_DRAG_PIXEL_THRESHOLD = 3; // px\n    // Pane resize\n    private paneHeightOverrides = new Map<string, number>();\n    private separatorDrag: {\n        indicatorName: string;\n        startY: number;\n        startH: number;\n    } | null = null;\n    // Axis dimensions (not user-resizable)\n    private readonly priceAxisWidth = PRICE_AXIS_WIDTH;\n    private readonly timeAxisHeight = TIME_AXIS_HEIGHT;\n    // Price axis state — fixed base range + user-controlled overrides\n    private priceScaleFactor = 1.0; // >1 = zoom out (more range), <1 = zoom in\n    private pricePanOffset = 0; // price units offset from vertical drag\n    private _displayedPriceRange: PriceRange | null = null; // lerp target; null = snap on next render\n    private _lockedAutoFitBase: PriceRange | null = null; // non-null = user has manually adjusted Y-axis\n    /**\n     * When setState() restores a persisted viewport but data isn't loaded yet,\n     * we stash the desired time window here and apply it from loadData() once\n     * bars are available. Cleared after one application.\n     */\n    private _pendingViewportRestore:\n        | { viewport?: { startTime: number; endTime: number }; priceScale?: { factor: number; panOffset: number } }\n        | null = null;\n    /**\n     * Debounces viewport/priceScale stateChange emissions during continuous\n     * gestures (pan, wheel-zoom, price-scale drag). Pan/zoom don't emit\n     * stateChange directly because doing so per-frame would be wasteful; this\n     * timer coalesces bursts so the persisted viewport catches up a few ms\n     * after the user stops interacting. Paired with the consumer's own\n     * debounce (e.g. CRM's 800ms save) for minimal traffic.\n     */\n    private _viewportPersistTimer: ReturnType<typeof setTimeout> | null = null;\n\n    /** Schedules a stateChange emission so viewport/priceScale changes made by\n     *  pan/zoom/price-scale drag reach persistence. Coalesces rapid calls. */\n    private scheduleViewportPersist(): void {\n        if (this._viewportPersistTimer) clearTimeout(this._viewportPersistTimer);\n        this._viewportPersistTimer = setTimeout(() => {\n            this._viewportPersistTimer = null;\n            this.emitStateChange();\n        }, 500);\n    }\n    private axisDrag: {\n        axis: 'price' | 'time' | 'subpane';\n        startPos: number;\n        startSize: number;\n        indicatorName?: string;\n    } | null = null;\n    private subPaneScaleFactors = new Map<string, number>();\n    private _mobileCrosshairActive = false;\n    private _mobileTapStartXY: { x: number; y: number } | null = null;\n    private _longPressTimer: ReturnType<typeof setTimeout> | null = null;\n    private _longPressPoint: { x: number; y: number } | null = null;\n    private _lastTouchTime = 0;\n    private _tradeButtonClickData: { price: number; y: number } | null = null;\n    // Interaction\n    private panHandler: PanHandler;\n    private zoomHandler: ZoomHandler;\n    private resizeObserver: ResizeObserver;\n    private disposeVvListener: () => void = () => {};\n    private rafId: number | null = null;\n    private countdownRafId: number | null = null;\n    private countdownActive = false;\n    private _cachedWrapRect: DOMRect | null = null;\n    private _cachedDrawRect: DOMRect | null = null;\n    // Touch drawing state\n    private _drawTouchAnchorActive = false; // true during the first-anchor touch gesture (suppress preview)\n    private _lastDrawingTouchPoint: { barIndex: number; price: number } | null = null;\n    private _drawTouchStartXY: { x: number; y: number } | null = null; // for tap vs drag detection\n    // Mobile drawing action flyout\n    private _mobileDrawingFlyout: HTMLDivElement | null = null;\n    // Fullscreen state\n    private _isCssFullscreen = false;\n    private get isFullscreen(): boolean {\n        return this._isCssFullscreen || !!document.fullscreenElement;\n    }\n    /** True when any trading action is in progress — popover open, draft placed, level drag active, or pending confirm. */\n    private get _isTradingActive(): boolean {\n        return (\n            (this.tradePopover?.isVisible ?? false) ||\n            this.draftOrderLabel !== null ||\n            (this.tradeDragHandler?.active ?? false) ||\n            this.pendingLevelDrags.size > 0\n        );\n    }\n    // UI config\n    private uiConfig: UiConfig;\n    private themeOverrides: ChartConfig['themeOverrides'];\n    private timezone: string = 'UTC';\n    private settingsCanvasColors: NonNullable<ChartSettings['canvasColors']> = {};\n    private aggregateFrom: ChartConfig['aggregateFrom'];\n    private labels: ChartLabels;\n    // Streaming\n    private streamAdapter: IWebSocketAdapter | null = null;\n    private liveBidAsk: { bid: number; ask: number } | null = null;\n    private tickClosePriceSource: 'bid' | 'ask' = 'bid';\n    /** True while an async data fetch is in-flight; suppresses tick processing to\n     *  prevent stale ticks from corrupting newly-loaded bars. */\n    private _suppressTicks = false;\n    // Trade / position levels\n    private levels: AnyLevel[] = [];\n    private tradeLevelHitAreas: TradeLevelHitArea[] = [];\n    private offViewportHitAreas: OffViewportHitArea[] = [];\n    private tradeLevelEditAreas: TradeLevelHitArea[] = [];\n    private tradeHoverAreas: TradeHoverArea[] = [];\n    private tradeLevelDragAreas: AnyDragArea[] = [];\n    private tradeLevelConfirmAreas: TradeLevelConfirmArea[] = [];\n    private tradeAddBracketAreas: TradeAddBracketArea[] = [];\n    private clusterBadgeAreas: ClusterBadgeHitArea[] = [];\n    private lastClusters: LevelCluster[] = [];\n    /** Set of cluster IDs that are currently expanded (fanned out). */\n    private expandedClusters: Set<string> = new Set();\n    private hoveredTradeLabel: string | null = null;\n    private selectedTradeLabel: string | null = null;\n    /**\n     * Label of the level whose external edit form is currently open (i.e. the label for which\n     * `tradeLevelEditOpen` was most recently emitted and no matching cancel/confirm has fired yet).\n     * Distinct from `selectedTradeLabel`, which can also be set by a plain desktop hover-click\n     * that just shows brackets without opening the form. Used so outside-click / cross-button\n     * can issue a proper cancel (emit `tradeLevelEditCancelled`) even when no pending drag is\n     * staged — e.g. the user opened the form on a position that has no SL/TP yet and clicks\n     * elsewhere without adding anything.\n     */\n    private _editOpenLabel: string | null = null;\n    private tradeCanvas!: HTMLCanvasElement;\n    private tradeCtx!: CanvasRenderingContext2D;\n    /** Estimated PNL text for draft order SL/TP bracket lines, set by setDraftBracketPnl(). */\n    private draftBracketPnl: { sl?: string; tp?: string } = {};\n    // TFC components\n    private tradeDragHandler: TradeDragHandler | null = null;\n    private tradeDragNewPrice: number | null = null;\n    /** Derived SL preview price during an entry drag in follow-brackets mode. */\n    private tradeDragNewSLPrice: number | null = null;\n    /** Derived TP preview price during an entry drag in follow-brackets mode. */\n    private tradeDragNewTPPrice: number | null = null;\n    /** bracketOrderLabel stored when a bracket drag starts, for use in the confirm message. */\n    private _pendingBracketOrderLabel: string | null = null;\n    /** ToClose sibling label for the SL bracket of the current entry drag (existing pending orders). */\n    private _slSiblingOrderLabel: string | null = null;\n    /** ToClose sibling label for the TP bracket of the current entry drag (existing pending orders). */\n    private _tpSiblingOrderLabel: string | null = null;\n    /** True when the current bracket drag is adding a NEW bracket (via +SL/+TP button). */\n    private _isBracketNew = false;\n    // Inline drag confirmation — accumulates changes per level until user confirms\n    private pendingLevelDrags = new Map<\n        string,\n        Array<{\n            field: 'main' | 'stopLoss' | 'takeProfit';\n            newPrice: number;\n            oldPrice: number;\n            isNew?: boolean;\n            isRemoval?: boolean;\n            bracketOrderLabel?: string;\n        }>\n    >();\n    // Trade from Charts settings\n    private tfcEnabled = true;\n    private tfcActive = true;\n    private tradeDisplayFilter: TradeDisplayFilter = 'all';\n    private positionRenderStyle: PositionRenderStyle = 'dot';\n    private tradesThresholdForHorizontalLine: number = 2;\n    /** Explicit user override from settings dialog. null = no override yet. */\n    private positionRenderStyleOverride: PositionRenderStyle | null = null;\n    private readonly RENDER_STYLE_LS_KEY = 'finchart:positionRenderStyle';\n    // Data loading\n    private dataLoader: ((params: DataLoaderParams) => Promise<OHLCVBar[]>) | null = null;\n    private isFetching = false;\n    private noMoreData = false;\n    private _loadGeneration = 0;\n    private maxCandles = 200;\n    private minInitialBars = 10;\n    private maxLookbackMs = 365 * 24 * 60 * 60 * 1000;\n    private prefetchThreshold = 80;\n    private defaultVisibleBars = DEFAULT_VISIBLE_BARS;\n    private defaultMobileVisibleBars: number | undefined = undefined;\n    private mobileBarDivisor: number = 2;\n    private explicitMobileDivisor: boolean = false;\n    private _autoVisibleBars = true; // false when defaultVisibleBars was explicitly set\n    private targetCandleWidth = DEFAULT_CANDLE_SLOT_WIDTH;\n    private maxSubPanes = 3;\n    private showCandleCountdown = true;\n    private candleCountdownTimeframes: Timeframe[] | 'all' | undefined;\n    private showTradeLevelsAlways = false;\n    private showPriceAxisCountdown = false;\n    private readonly SHOW_SLTP_ALWAYS_LS_KEY = 'finchart.showTradeLevelsAlways';\n    private readonly PRICE_AXIS_COUNTDOWN_LS_KEY = 'finchart.showPriceAxisCountdown';\n    private loadingOverlayEl: HTMLDivElement | null = null;\n    private noDataOverlayEl: HTMLDivElement | null = null;\n    // Watermark\n    private logoImage: HTMLImageElement | null = null;\n\n    constructor(config: ChartConfig) {\n        if (typeof window === 'undefined' || typeof document === 'undefined') {\n            throw new Error('acttrader-charts requires a browser environment');\n        }\n\n        enableKeyboardOverlayMode();\n\n        // iOS Safari can silently shift the document during input focus/blur\n        // without resizing any observed element, which leaves _cachedDrawRect /\n        // _cachedWrapRect stale. Stale rects = wrong client→canvas coordinates =\n        // canvas hit-tests miss (e.g. trade-level confirm/cancel buttons stop\n        // responding to taps). Invalidate the caches on visualViewport changes\n        // so the next touch re-measures fresh.\n        if (window.visualViewport) {\n            const vv = window.visualViewport;\n            const invalidate = (): void => {\n                this._cachedWrapRect = null;\n                this._cachedDrawRect = null;\n            };\n            vv.addEventListener('resize', invalidate);\n            vv.addEventListener('scroll', invalidate);\n            this.disposeVvListener = () => {\n                vv.removeEventListener('resize', invalidate);\n                vv.removeEventListener('scroll', invalidate);\n            };\n        }\n\n        const {\n            container,\n            theme = 'dark',\n            series = 'candlestick',\n            showVolume = true,\n            showUI = true,\n            timeframe = '1D',\n            duration = undefined,\n            symbol = '',\n            isins,\n            onIsinSelect,\n            onSymbolClick,\n            onOrderSubmit,\n            dataLoader,\n            durationTimeframeMap,\n            uiConfig,\n            labels,\n            tickActivityMs = 30_000,\n            hideSymbolAndTick = false,\n            hideOHLCV = false,\n            showBottomBar = false,\n        } = config;\n\n        this.dataLoader = dataLoader ?? null;\n        this.drawingToolsEnabled = config.showDrawingTools !== false;\n        this.settingsEnabled = config.showSettings !== false;\n        this.fullscreenEnabled = config.showFullscreenButton !== false;\n        this.uiConfig = resolveUiConfig(uiConfig);\n        this.labels = resolveLabels(labels);\n        this.tickActivityMs = tickActivityMs;\n        this.maxCandles = config.maxCandles ?? 200;\n        this.minInitialBars = Math.max(0, config.minInitialBars ?? 10);\n        this.maxLookbackMs = Math.max(0, config.maxLookbackMs ?? 365 * 24 * 60 * 60 * 1000);\n        this.prefetchThreshold = config.prefetchThreshold ?? 80;\n        this.defaultVisibleBars = config.defaultVisibleBars ?? DEFAULT_VISIBLE_BARS;\n        this.defaultMobileVisibleBars = config.defaultMobileVisibleBars;\n        this.explicitMobileDivisor = config.mobileBarDivisor !== undefined;\n        this.mobileBarDivisor = config.mobileBarDivisor ?? 2;\n        this._autoVisibleBars =\n            config.defaultVisibleBars == null && config.defaultMobileVisibleBars == null;\n        this.targetCandleWidth = config.targetCandleWidth ?? DEFAULT_CANDLE_SLOT_WIDTH;\n        this.viewport = {\n            ...this.viewport,\n            endIndex: initialVisibleBars(\n                this.mobileBarDivisor,\n                this.explicitMobileDivisor,\n                this.defaultVisibleBars,\n                this.defaultMobileVisibleBars\n            ),\n        };\n        this._targetViewport = { ...this.viewport };\n        this.maxSubPanes = config.maxSubPanes ?? 3;\n        this.tickClosePriceSource = config.tickClosePriceSource ?? 'bid';\n        this.tradesThresholdForHorizontalLine = config.tradesThresholdForHorizontalLine ?? 2;\n        // Config-provided values (restored from persisted state) take precedence over localStorage.\n        if (config.positionRenderStyle === 'line' || config.positionRenderStyle === 'dot') {\n            this.positionRenderStyleOverride = config.positionRenderStyle;\n        } else {\n            const _storedStyle = localStorage.getItem(\n                this.RENDER_STYLE_LS_KEY\n            ) as PositionRenderStyle | null;\n            if (_storedStyle === 'line' || _storedStyle === 'dot') {\n                this.positionRenderStyleOverride = _storedStyle;\n            }\n        }\n        if (config.tradeDisplayFilter) {\n            this.tradeDisplayFilter = config.tradeDisplayFilter;\n        }\n        if (config.canvasColors) {\n            this.settingsCanvasColors = config.canvasColors;\n        }\n        this.recomputeRenderStyle();\n        this.showBidAskLines = config.showBidAskLines ?? false;\n        this.showActLogo = config.showActLogo ?? false;\n        this.hideLevelConfirmCancel = config.hideLevelConfirmCancel ?? false;\n        this.deselectActiveOnOutsideClick = config.deselectActiveOnOutsideClick ?? false;\n        this.tradeLevelButtonScale = Math.min(Math.max(config.tradeLevelButtonScale ?? 1, 1), 3);\n        this.levelClusteringEnabled = config.levelClusteringEnabled ?? true;\n        this.clusterThresholdDistance = config.clusterThresholdDistance ?? 20;\n        this.enableThemeToggle = config.enableThemeToggle ?? false;\n        this.tfcEnabled = config.tfcEnabled !== false;\n        this.tfcActive = this.tfcEnabled;\n        this.showCandleCountdown = config.showCandleCountdown ?? true;\n        this.candleCountdownTimeframes = config.candleCountdownTimeframes;\n        this.showTradeLevelsAlways = config.showTradeLevelsAlways ?? false;\n        this.showPriceAxisCountdown = config.showPriceAxisCountdown ?? false;\n        try {\n            const persistedSlTp = localStorage.getItem(this.SHOW_SLTP_ALWAYS_LS_KEY);\n            if (persistedSlTp !== null) this.showTradeLevelsAlways = persistedSlTp === 'true';\n            const persistedCountdown = localStorage.getItem(this.PRICE_AXIS_COUNTDOWN_LS_KEY);\n            if (persistedCountdown !== null) this.showPriceAxisCountdown = persistedCountdown === 'true';\n        } catch {\n            /* localStorage may be unavailable (private mode, sandbox) — fall back to config defaults */\n        }\n        this._onOrderSubmit = onOrderSubmit;\n        if (config.minLots !== undefined) {\n            // eslint-disable-next-line no-console\n            console.warn('[acttrader-charts] ChartConfig.minLots is deprecated. DraftOrderQtyInput has been removed. The value is stored and used as the submitted lot size.');\n            this._minLots = config.minLots;\n        }\n        if (config.showQuantityField !== undefined) this._showQuantityField = config.showQuantityField;\n        if (config.quantityFieldConfig) {\n            if (config.quantityFieldConfig.minLots !== undefined) this._qtyFieldMin = config.quantityFieldConfig.minLots;\n            if (config.quantityFieldConfig.maxLots !== undefined) this._qtyFieldMax = config.quantityFieldConfig.maxLots;\n        }\n        if (config.onLotsChange !== undefined) {\n            // eslint-disable-next-line no-console\n            console.warn('[acttrader-charts] ChartConfig.onLotsChange is deprecated. DraftOrderQtyInput has been removed; this callback will never fire.');\n        }\n        if (config.hideQtyButton !== undefined) {\n            // eslint-disable-next-line no-console\n            console.warn('[acttrader-charts] ChartConfig.hideQtyButton is deprecated and is a no-op. DraftOrderQtyInput has been removed.');\n        }\n\n        this.themeName = theme === 'dark' ? 'dark' : 'light';\n        this.themeOverrides = config.themeOverrides;\n        this.timezone = config.timezone === 'local'\n            ? Intl.DateTimeFormat().resolvedOptions().timeZone\n            : (config.timezone ?? 'UTC');\n        this.aggregateFrom = config.aggregateFrom;\n        // Initial theme: deep-merge overrides without CSS var resolution yet\n        // (wrapper isn't in the DOM until later; resolution happens post-mount)\n        const _baseTheme = this.themeName === 'dark' ? DARK_THEME : LIGHT_THEME;\n        this.theme = deepMergeTheme(_baseTheme, this.themeOverrides?.[this.themeName]);\n        this.series = series;\n        this.showVolume = showVolume;\n        this.timeframe = timeframe;\n        this.duration = duration;\n        this.symbol = symbol;\n\n        // ── Build DOM layout ─────────────────────────────────────────────────\n\n        this.wrapper = document.createElement('div');\n        Object.assign(this.wrapper.style, {\n            display: 'flex',\n            flexDirection: 'column',\n            width: '100%',\n            height: '100%',\n            overflow: 'hidden',\n            boxSizing: 'border-box',\n        });\n\n        // Top bar\n        if (showUI) {\n            const resolvedDurationMap = { ...DURATION_TIMEFRAME_MAP, ...durationTimeframeMap };\n            this.topBar = new TopBar(\n                (s) => this.setSeries(s),\n                (tf) => {\n                    this.timeframe = tf;\n                    this.emitter.emit('timeframeChange', { timeframe: tf });\n                    this.emitStateChange();\n                    this.updateCountdownState();\n                    this.triggerLoad('timeframe');\n                },\n                (name) => this.addIndicatorByName(name),\n                (d, tf) => {\n                    this.duration = d;\n                    this.timeframe = tf;\n                    this.topBar?.setTimeframe(tf);\n                    this.bottomBar?.setActive(d);\n                    this.emitter.emit('durationChange', { duration: d, timeframe: tf });\n                    this.emitStateChange();\n                    this.updateCountdownState();\n                    this.triggerLoad('duration');\n                },\n                () => {\n                    this.openChartSettings();\n                },\n                () => {\n                    this.toggleFullscreen();\n                },\n                this.drawingToolsEnabled ? () => this.toggleDrawingTools() : null,\n                this.drawingToolsEnabled,\n                this.settingsEnabled,\n                this.fullscreenEnabled,\n                this.tfcEnabled,\n                this.tfcActive,\n                this.tfcEnabled ? (enabled: boolean) => { this.setTfcActive(enabled); } : null,\n                this.series,\n                this.timeframe,\n                null,\n                resolvedDurationMap,\n                this.theme,\n                this.uiConfig.topBar,\n                this.labels.topBar,\n                () => this.emitUiState(),\n            );\n            this.topBar.setIndicatorOptions(\n                INDICATORS_CONFIG.filter((e) => e.enabled).map((e) => ({\n                    value: e.short_name,\n                    label: `${e.name} (${e.short_name})`,\n                    category: e.type,\n                }))\n            );\n            this.wrapper.appendChild(this.topBar.el);\n            // Sync icon to the real fullscreen state on init (WebViews may start in fullscreen)\n            this.topBar.setFullscreen(this.isFullscreen);\n        }\n\n        // Middle row: left bar + canvas wrapper\n        const middleRow = document.createElement('div');\n        Object.assign(middleRow.style, {\n            display: 'flex',\n            flex: '1',\n            minHeight: '0',\n            overflow: 'hidden',\n            position: 'relative', // needed for LeftBar absolute overlay in mobile mode\n        });\n\n        if (showUI && this.drawingToolsEnabled) {\n            this.leftBar = new LeftBar(\n                (tool) => this.setDrawingTool(tool),\n                (actionId) => {\n                    switch (actionId) {\n                        case 'undo':\n                            this.undoDrawing();\n                            break;\n                        case 'redo':\n                            this.redoDrawing();\n                            break;\n                        case 'delete_selected':\n                            this.deleteSelectedDrawing();\n                            break;\n                        case 'clear_all':\n                            this.clearAllDrawings();\n                            break;\n                        case 'hide_all':\n                            this.hideAllDrawings();\n                            break;\n                        case 'show_all':\n                            this.showAllDrawings();\n                            break;\n                        case 'lock_all':\n                            this.lockAllDrawings();\n                            break;\n                        case 'unlock_all':\n                            this.unlockAllDrawings();\n                            break;\n                    }\n                },\n                () => {\n                    // Mobile: bar auto-closed after tool selection — sync pencil button\n                    this.leftBarVisible = false;\n                    this.topBar?.setDrawingsBtnActive(false);\n                },\n                this.theme,\n                this.uiConfig.drawingToolbar,\n                this.labels.drawingToolbar\n            );\n            middleRow.appendChild(this.leftBar.el);\n        }\n\n        this.canvasWrap = document.createElement('div');\n        Object.assign(this.canvasWrap.style, {\n            flex: '1',\n            position: 'relative',\n            overflow: 'hidden',\n            touchAction: 'none',\n        });\n\n        // Main chart canvas (no pointer events — sits below the drawing canvas)\n        this.canvas = document.createElement('canvas');\n        Object.assign(this.canvas.style, {\n            position: 'absolute',\n            top: '0',\n            left: '0',\n            width: '100%',\n            height: '100%',\n            pointerEvents: 'none',\n        });\n        this.canvasWrap.appendChild(this.canvas);\n\n        // Trade level canvas — sits above main canvas, below drawing canvas\n        this.tradeCanvas = document.createElement('canvas');\n        Object.assign(this.tradeCanvas.style, {\n            position: 'absolute',\n            top: '0',\n            left: '0',\n            width: '100%',\n            height: '100%',\n            pointerEvents: 'none',\n        });\n        this.canvasWrap.appendChild(this.tradeCanvas);\n\n        // Drawing overlay canvas — always on top, always receives all mouse events\n        this.drawCanvas = document.createElement('canvas');\n        Object.assign(this.drawCanvas.style, {\n            position: 'absolute',\n            top: '0',\n            left: '0',\n            width: '100%',\n            height: '100%',\n            cursor: 'crosshair',\n            touchAction: 'none',\n            userSelect: 'none',\n        });\n        // Vendor-prefixed properties not in CSSStyleDeclaration typings\n        (this.drawCanvas.style as unknown as Record<string, string>)['webkitUserSelect'] = 'none';\n        (this.drawCanvas.style as unknown as Record<string, string>)['webkitTouchCallout'] = 'none';\n        this.canvasWrap.appendChild(this.drawCanvas);\n\n        // Text input overlay — shown when editing text-type drawings\n        this.textInputEl = document.createElement('input');\n        this.textInputEl.type = 'text';\n        Object.assign(this.textInputEl.style, {\n            position: 'absolute',\n            display: 'none',\n            zIndex: '15',\n            background: 'transparent',\n            border: 'none',\n            borderBottom: '1px solid #2196f3',\n            color: '#f5f5f5',\n            // iOS Safari auto-zooms on focus for inputs <16px without ever\n            // restoring the zoom — keep at 16px to disable that.\n            font: '16px system-ui, sans-serif',\n            outline: 'none',\n            minWidth: '60px',\n            padding: '0 2px',\n        });\n        this.canvasWrap.appendChild(this.textInputEl);\n\n        // Loading overlay — shown during data fetches (only when UI is visible;\n        // mobile wrappers provide their own loading indicator)\n        if (showUI) {\n            this.loadingOverlayEl = document.createElement('div');\n            Object.assign(this.loadingOverlayEl.style, {\n                display: 'none',\n                position: 'absolute',\n                top: '0',\n                left: '0',\n                width: '100%',\n                height: '100%',\n                alignItems: 'center',\n                justifyContent: 'center',\n                pointerEvents: 'none',\n                zIndex: '20',\n            });\n            const loadingLabel = document.createElement('span');\n            loadingLabel.textContent = this.labels.chart.loading;\n            Object.assign(loadingLabel.style, {\n                color: 'rgba(200,200,200,0.9)',\n                fontSize: '13px',\n                background: 'rgba(0,0,0,0.45)',\n                padding: '4px 12px',\n                borderRadius: '4px',\n            });\n            this.loadingOverlayEl.appendChild(loadingLabel);\n            this.canvasWrap.appendChild(this.loadingOverlayEl);\n\n            this.noDataOverlayEl = document.createElement('div');\n            Object.assign(this.noDataOverlayEl.style, {\n                display: 'none',\n                position: 'absolute',\n                top: '0',\n                left: '0',\n                width: '100%',\n                height: '100%',\n                alignItems: 'center',\n                justifyContent: 'center',\n                pointerEvents: 'none',\n                zIndex: '19',\n            });\n            const noDataLabel = document.createElement('span');\n            noDataLabel.textContent = this.labels.chart.noData;\n            Object.assign(noDataLabel.style, {\n                color: 'rgba(200,200,200,0.9)',\n                fontSize: '13px',\n                background: 'rgba(0,0,0,0.45)',\n                padding: '4px 12px',\n                borderRadius: '4px',\n            });\n            this.noDataOverlayEl.appendChild(noDataLabel);\n            this.canvasWrap.appendChild(this.noDataOverlayEl);\n        }\n\n        // Symbol info overlay — top-left of chart canvas.\n        // `hideSymbolAndTick` hides the streaming dot + symbol name only;\n        // `hideOHLCV` hides the O/H/L/C(/V) strip. They are independent.\n        if (showUI && !(hideSymbolAndTick && hideOHLCV)) {\n            this.siEl = document.createElement('div');\n            Object.assign(this.siEl.style, {\n                position: 'absolute',\n                top: '6px',\n                left: '6px',\n                zIndex: '10',\n                display: 'flex',\n                alignItems: 'center',\n                gap: '8px',\n                pointerEvents: 'none',\n            });\n\n            if (!hideSymbolAndTick) {\n                this.siSymbolSpan = document.createElement('span');\n                Object.assign(this.siSymbolSpan.style, {\n                    color: this.theme.axisText,\n                    fontSize: '17px',\n                    fontFamily: \"'Inter', system-ui, sans-serif\",\n                    fontWeight: '700',\n                    display: symbol ? 'inline' : 'none',\n                });\n                this.siSymbolSpan.textContent = symbol ?? '';\n\n                // Symbol click — onSymbolClick suppresses the picker modal (for native WebView hosts).\n                // Falls back to the ISIN picker modal when only onIsinSelect is provided.\n                if (onSymbolClick) {\n                    Object.assign(this.siSymbolSpan.style, {\n                        cursor: 'pointer',\n                        textDecoration: 'underline',\n                        pointerEvents: 'auto',\n                    });\n                    this.siSymbolSpan.addEventListener('click', () => {\n                        onSymbolClick(this.siSymbolSpan?.textContent ?? '');\n                    });\n                } else if (onIsinSelect) {\n                    if (isins) this.isins = isins;\n                    this.isinPickerModal = new IsinPickerModal(this.theme, onIsinSelect, () => this.emitUiState());\n                    this.getFloatingRoot().appendChild(this.isinPickerModal.el);\n                    Object.assign(this.siSymbolSpan.style, {\n                        cursor: 'pointer',\n                        textDecoration: 'underline',\n                        pointerEvents: 'auto',\n                    });\n                    this.siSymbolSpan.addEventListener('click', () => {\n                        this.isinPickerModal!.show(this.isins, this.siSymbolSpan!.textContent ?? '');\n                    });\n                }\n\n                this.siStreamDot = document.createElement('span');\n                Object.assign(this.siStreamDot.style, {\n                    width: '7px',\n                    height: '7px',\n                    borderRadius: '50%',\n                    background: this.theme.ui.stream.disconnected,\n                    display: 'inline-block',\n                    flexShrink: '0',\n                });\n            }\n\n            if (!hideOHLCV) {\n                this.siOHLCSpan = document.createElement('span');\n                Object.assign(this.siOHLCSpan.style, {\n                    fontSize: '14px',\n                    fontFamily: \"'Inter', system-ui, sans-serif\",\n                    whiteSpace: 'nowrap',\n                });\n\n                this.siOHLC2Span = document.createElement('span');\n                Object.assign(this.siOHLC2Span.style, {\n                    fontSize: '14px',\n                    fontFamily: \"'Inter', system-ui, sans-serif\",\n                    whiteSpace: 'nowrap',\n                });\n            }\n\n            // Row 1: dot + symbol + O H  (always a flex row)\n            const siRow1 = document.createElement('div');\n            Object.assign(siRow1.style, {\n                display: 'flex',\n                alignItems: 'center',\n                gap: '8px',\n            });\n            if (this.siStreamDot) siRow1.append(this.siStreamDot);\n            if (this.siSymbolSpan) siRow1.append(this.siSymbolSpan);\n            if (this.siOHLCSpan) siRow1.append(this.siOHLCSpan);\n\n            // siEl contains row1 + row2 (siOHLC2Span); direction switches on mobile\n            this.siEl.append(siRow1);\n            if (this.siOHLC2Span) this.siEl.append(this.siOHLC2Span);\n            this.canvasWrap.appendChild(this.siEl);\n        }\n\n        // Indicator overlay — sits inside canvasWrap above everything\n        if (showUI) {\n            this.indicatorOverlay = new IndicatorOverlay(\n                this.theme,\n                this.uiConfig.indicatorOverlay,\n                this.labels.chart\n            );\n            this.canvasWrap.appendChild(this.indicatorOverlay.el);\n\n            this.indicatorSettingsDialog = new IndicatorSettingsDialog(\n                this.theme,\n                this.labels.dialogs,\n                () => this.emitUiState(),\n            );\n            this.getFloatingRoot().appendChild(this.indicatorSettingsDialog.el);\n\n            // Scroll-to-end button — bottom-right, shown when last candle is off-screen\n            this.scrollToEndBtn = document.createElement('button');\n            this.scrollToEndBtn.title = this.labels.chart.scrollToLatest;\n            this.applyScrollToEndBtnStyles();\n            this.scrollToEndBtn.addEventListener('click', () => this.scrollToEnd());\n            this.canvasWrap.appendChild(this.scrollToEndBtn);\n\n            // Reset view button — bottom-center, always visible\n            this.resetViewBtn = document.createElement('button');\n            this.resetViewBtn.title = 'Reset view';\n            this.applyResetViewBtnStyles();\n            this.resetViewBtn.addEventListener('click', () => this.resetView());\n            this.canvasWrap.appendChild(this.resetViewBtn);\n        }\n\n        // TFC — TradePanel + TradeDragHandler (always initialised when trading is enabled)\n        this.tradeDragHandler = new TradeDragHandler();\n\n        if (config.onLevelDragEnd) {\n            this.emitter.on('tradeLevelDragEnd', config.onLevelDragEnd);\n        }\n        if (config.onLevelEdit) {\n            this.emitter.on('tradeLevelEdit', config.onLevelEdit);\n        }\n\n        // Trade button + popover\n        if (onOrderSubmit) {\n            this.tradePopover = new TradePopover(\n                this.theme,\n                0.01,\n                this.symbol,\n                (side, price, orderType) => {\n                    this.createDraftOrder(side, price, orderType);\n                },\n                this.labels.trade,\n                () => this.emitUiState(),\n            );\n            this.canvasWrap.appendChild(this.tradePopover.el);\n\n            this.tradeButton = new TradeButton(\n                this.theme,\n                this.priceAxisWidth,\n                () => {\n                    if (this._tradeButtonClickData && this.tradePopover) {\n                        this.tradeButton?.hide();\n                        const btnRight = this.priceAxisWidth + 10 + 22 + 4; // right offset inside canvasWrap\n                        const { price, y } = this._tradeButtonClickData;\n                        this.tradePopover.show(\n                            price,\n                            y,\n                            btnRight,\n                            this.dataStore.getPricePrecision(),\n                            this._orderTypeForPrice('buy',  price),\n                            this._orderTypeForPrice('sell', price),\n                        );\n                    }\n                },\n                this.labels.trade,\n                this.uiConfig.tradeButton,\n            );\n            this.canvasWrap.appendChild(this.tradeButton.el);\n            this.tradeButton.el.addEventListener('mouseenter', () => {\n                this.crosshair = null;\n                this.scheduleRender();\n            });\n            this.tradeButton.el.addEventListener('mousemove', (e) => {\n                if (e.buttons !== 0) return;\n                const rect = this._cachedDrawRect ?? this.drawCanvas.getBoundingClientRect();\n                const y = e.clientY - rect.top;\n                const { priceH } = this.getChartLayout();\n\n                // Hide the button when it overlaps an off-viewport indicator pill\n                const btnHalfH = this.uiConfig.tradeButton.size / 2;\n                if (overlapsOffViewportPill(y, btnHalfH, this.offViewportHitAreas)) {\n                    this.tradeButton?.hide();\n                    return;\n                }\n\n                if (y >= 0 && y <= priceH) {\n                    this.tradeButton?.setY(y);\n                    const priceRange =\n                        this._displayedPriceRange ?? this.getScaledPriceRange(this.viewport);\n                    const price = this.scaleManager.pixelToPrice(y, priceRange, priceH);\n                    this._tradeButtonClickData = { price, y };\n                }\n            });\n        }\n\n        middleRow.appendChild(this.canvasWrap);\n        this.wrapper.appendChild(middleRow);\n\n        // Bottom bar — duration selector (right-aligned)\n        if (showUI && showBottomBar) {\n            const resolvedDurationMap = { ...DURATION_TIMEFRAME_MAP, ...durationTimeframeMap };\n            this.bottomBar = new BottomBar(\n                (d, tf) => {\n                    this.duration = d;\n                    this.timeframe = tf;\n                    this.topBar?.setTimeframe(tf);\n                    this.emitter.emit('durationChange', { duration: d, timeframe: tf });\n                    this.emitStateChange();\n                    this.updateCountdownState();\n                    this.triggerLoad('duration');\n                },\n                this.duration ?? null,\n                this.theme,\n                resolvedDurationMap,\n                this.uiConfig.bottomBar,\n                this.labels.bottomBar\n            );\n            this.wrapper.appendChild(this.bottomBar.el);\n        }\n\n        container.appendChild(this.wrapper);\n\n        // Resolve CSS custom properties now that wrapper is in the live DOM.\n        // Sub-components created above (topBar, leftBar, tradeButton) receive the\n        // resolved theme so DOM colors and canvas fills both use concrete values.\n        if (this.themeOverrides) {\n            this.theme = this.buildTheme(this.themeName);\n            this.topBar?.setTheme(this.theme);\n            this.bottomBar?.setTheme(this.theme);\n            this.leftBar?.setTheme(this.theme);\n            this.tradeButton?.setTheme(this.theme, this.priceAxisWidth);\n        }\n\n        // ── Canvas contexts ──────────────────────────────────────────────────\n\n        const ctx = this.canvas.getContext('2d');\n        if (!ctx) throw new Error('Canvas 2D context unavailable');\n        this.ctx = ctx;\n\n        const drawCtx = this.drawCanvas.getContext('2d');\n        if (!drawCtx) throw new Error('Drawing canvas 2D context unavailable');\n        this.drawCtx = drawCtx;\n\n        const tradeCtx = this.tradeCanvas.getContext('2d');\n        if (!tradeCtx) throw new Error('Trade canvas 2D context unavailable');\n        this.tradeCtx = tradeCtx;\n\n        // Preload watermark logo (only when enabled)\n        if (this.showActLogo) {\n            const img = new Image();\n            img.onload = () => {\n                this.logoImage = img;\n                this.scheduleRender();\n            };\n            img.src = actLogoUrl;\n        }\n\n        // Deactivate tool + sync UI when a drawing is finished\n        this.drawingManager.setOnComplete(() => {\n            this.leftBar?.setActiveTool(null);\n            this.drawCanvas.style.cursor = 'default';\n        });\n        // Notify state persistence whenever drawings change\n        this.drawingManager.onDrawingsChange = () => this.emitStateChange();\n\n        // Refresh each mutated point's timestamp from the current dataStore so\n        // drag/resize operations preserve the time anchor across subsequent\n        // timeframe changes and data reloads.\n        this.drawingManager.onPointsMutated = (drawing) => {\n            for (const pt of drawing.points) {\n                const t = this.barIndexToTimestamp(pt.barIndex);\n                if (t != null) pt.timestamp = t;\n            }\n        };\n\n        // Show text input when a text-type drawing is placed\n        this.drawingManager.onStartTextEdit = (drawing) => this.showTextInput(drawing);\n\n        // Floating per-drawing style popover. Lives in canvasWrap so it sits on\n        // top of the chart but stays clipped within the chart container.\n        this.drawingStylePopover = new DrawingStylePopover(\n            this.canvasWrap,\n            this.theme,\n            (id, patch) => this.updateDrawingStyle(id, patch),\n        );\n        this.drawingManager.onSelectionChange = (drawing) => {\n            if (drawing && drawing.complete && drawing.locked !== true) {\n                const anchor = this.computeDrawingAnchorPx(drawing);\n                if (anchor) this.drawingStylePopover?.show(drawing, anchor.x, anchor.y);\n                else this.drawingStylePopover?.hide();\n            } else {\n                this.drawingStylePopover?.hide();\n            }\n        };\n\n        // ── Interaction ──────────────────────────────────────────────────────\n\n        this.panHandler = new PanHandler(\n            this.drawCanvas,\n            () => this._targetViewport,\n            (v) => {\n                this._targetViewport = v;\n                this.clearDuration();\n                this.checkNeedMoreData();\n                this.scheduleRender();\n                this.scheduleViewportPersist();\n            },\n            () => this.dataStore.length,\n            () => this.scheduleRender(),\n            () =>\n                this.drawingManager.getActiveTool() !== null ||\n                this.drawingManager.isDraggingDrawing() ||\n                this.drawingManager.isResizingDrawing() ||\n                this.separatorDrag !== null ||\n                this.axisDrag !== null ||\n                (this.tradeDragHandler?.active ?? false) ||\n                this._mobileCrosshairActive,\n            (deltaY: number) => {\n                if (this.priceScaleFactor === 1.0) return;\n                const { priceH } = this.getChartLayout();\n                const currentRange =\n                    this._displayedPriceRange ?? this.getScaledPriceRange(this._targetViewport);\n                const pricePerPixel = (currentRange.max - currentRange.min) / priceH;\n                this.pricePanOffset += deltaY * pricePerPixel;\n                this.scheduleRender();\n                this.scheduleViewportPersist();\n            },\n            () => {\n                this._isPanning = true;\n            },\n            () => {\n                this._isPanning = false;\n            },\n            {\n                enabled:     config.momentumScrollEnabled,\n                decay:       config.momentumDecay,\n                threshold:   config.momentumThreshold,\n                maxVelocity: config.momentumMaxVelocity,\n            } satisfies MomentumOptions,\n        );\n\n        this.zoomHandler = new ZoomHandler(\n            this.drawCanvas,\n            () => this._targetViewport,\n            (v) => {\n                this._targetViewport = v;\n                this.clearDuration();\n                this.checkNeedMoreData();\n                this.scheduleRender();\n                this.scheduleViewportPersist();\n            },\n            () => this.dataStore.length,\n            () => this.scheduleRender(),\n            () => this._cachedDrawRect ?? this.drawCanvas.getBoundingClientRect(),\n            () => this.getChartLayout().chartW,\n            (dx: number) => {\n                const vp = this._targetViewport;\n                const visibleBars = vp.endIndex - vp.startIndex;\n                const barsPerPixel = visibleBars / this.drawCanvas.width;\n                const shift = dx * barsPerPixel;\n                const maxStart = Math.max(0, this.dataStore.length - Math.floor(visibleBars / 2));\n                const newStart = Math.max(0, Math.min(maxStart, vp.startIndex + shift));\n                this._targetViewport = {\n                    ...vp,\n                    startIndex: newStart,\n                    endIndex: newStart + visibleBars,\n                };\n                this.clearDuration();\n                this.checkNeedMoreData();\n                this.scheduleRender();\n                this.scheduleViewportPersist();\n            }\n        );\n\n        this.drawCanvas.addEventListener('mousemove', this.onMouseMove);\n        this.drawCanvas.addEventListener('mouseleave', this.onMouseLeave);\n        this.drawCanvas.addEventListener('mousedown', this.onCanvasClick);\n        this.drawCanvas.addEventListener('dblclick', this.onDoubleClick);\n        window.addEventListener('mouseup', this.onMouseUp);\n        this.drawCanvas.addEventListener('touchstart', this.onDrawingTouchStart, {\n            passive: false,\n        });\n        this.drawCanvas.addEventListener('touchmove', this.onDrawingTouchMove, { passive: false });\n        this.drawCanvas.addEventListener('touchend', this.onDrawingTouchEnd, { passive: false });\n        // Prevent iOS long-press context menu / text-selection callout on the canvas\n        this.drawCanvas.addEventListener('contextmenu', (e) => e.preventDefault());\n\n        // Keyboard shortcuts for drawings\n        document.addEventListener('keydown', this.onKeyDown);\n\n        // Sync fullscreen button and re-parent floating elements on fullscreen change\n        // Listen on document too so Escape-key exits are caught reliably\n        const onFullscreenChange = () => {\n            const active = !!document.fullscreenElement;\n            if (!active) this._isCssFullscreen = false; // native exit clears CSS state\n            this.topBar?.setFullscreen(active);\n            this.reparentFloatingElements();\n        };\n        this.wrapper.addEventListener('fullscreenchange', onFullscreenChange);\n        document.addEventListener('fullscreenchange', onFullscreenChange);\n\n        // ── Resize ───────────────────────────────────────────────────────────\n\n        this.resizeObserver = new ResizeObserver(() => this.onResize());\n        this.resizeObserver.observe(this.canvasWrap);\n        this.onResize();\n\n        // Trigger initial data load if a loader was provided\n        if (this.dataLoader) {\n            this.triggerLoad('initial');\n        }\n    }\n\n    // ── Public API ────────────────────────────────────────────────────────────\n\n    /**\n     * Completely resets the chart to a clean, empty state.\n     *\n     * Cancels any in-flight data fetch, clears all bars, resets the price/time\n     * axes, discards the live bid/ask price line, and removes all user-drawn\n     * drawings and trade/position levels (including any pending draft order\n     * state). The chart will render as blank until the next `loadData()` call.\n     *\n     * Call this before switching to a new symbol so that no previous symbol's\n     * data, drawings, trade levels, price lines, or stale ticks can bleed into\n     * the new chart:\n     * ```\n     * chart.setSymbol('GBPUSD').resetData();\n     * // … fetch new bars, then:\n     * chart.loadData(newBars);\n     * ```\n     *\n     * If you need to clear bars but preserve drawings (e.g. on a data refresh\n     * of the same symbol), call `loadData([])` directly instead.\n     */\n    resetData(): this {\n        // Cancel any in-flight fetch so its result is ignored when it arrives.\n        ++this._loadGeneration;\n        // Dismiss any loading overlay that triggerLoad() showed — the cancelled\n        // promise's .then() will early-return and never call setLoading(false).\n        this.setLoading(false);\n        this.setNoData(false);\n        this.drawingManager.clearAll();\n        this.levels = [];\n        this._draftQtyPillArea = undefined;\n        this._pendingBracketOrderLabel = null;\n        return this.loadData([]);\n    }\n\n    loadData(bars: OHLCVBar[], fitAll = false): this {\n        this.isFetching = false;\n        this.noMoreData = false;\n        this._suppressTicks = false;\n        if (bars.length > 0) this.setNoData(false);\n        this.liveBidAsk = null;\n        this.pricePanOffset = 0;\n        this.priceScaleFactor = 1.0;\n        this._displayedPriceRange = null;\n        this._lockedAutoFitBase = null;\n        this.dataStore.set(bars);\n        const rawW =\n            (this._cachedWrapRect?.width ?? this.canvasWrap.getBoundingClientRect().width) -\n            this.priceAxisWidth;\n        const autoChartW = this._autoVisibleBars && rawW > 0 ? rawW : undefined;\n        const loadVisibleBars = initialVisibleBars(\n            this.mobileBarDivisor,\n            this.explicitMobileDivisor,\n            this.defaultVisibleBars,\n            this.defaultMobileVisibleBars,\n            autoChartW,\n            this.targetCandleWidth\n        );\n        this._defaultVisibleBars = loadVisibleBars;\n        this.viewport = {\n            ...this.viewport,\n            startIndex: fitAll\n                ? 0\n                : Math.max(0, bars.length - loadVisibleBars + LOOKAHEAD),\n            endIndex: bars.length + LOOKAHEAD,\n        };\n        this._targetViewport = { ...this.viewport };\n        const hasVol = this.dataStore.hasVolumeData;\n        if (!hasVol) this.showVolume = false;\n        this.topBar?.setVolumeControl(this.showVolume, hasVol);\n        if (this.showVolume && hasVol) {\n            this.indicatorOverlay?.addPill(\n                'VOL',\n                this.theme.volume.up,\n                'VOL',\n                'Chart',\n                true,\n                () => {\n                    this.setVolume(false);\n                    this.indicatorOverlay?.removePill('VOL');\n                    this.topBar?.setVolumeControl(false, this.dataStore.hasVolumeData);\n                },\n                null,\n                () => {\n                    this.setVolume(!this.showVolume);\n                    this.indicatorOverlay?.updatePillVisibility('VOL', this.showVolume);\n                    this.scheduleRender();\n                }\n            );\n        }\n        this.recomputeIndicators();\n        this.reanchorDrawingsByTimestamp();\n        // Apply any viewport/priceScale stashed by a setState() that ran before\n        // bars were available (typical refresh flow: CRM calls setState right\n        // after construction, data arrives here).\n        if (this._pendingViewportRestore) {\n            const pending = this._pendingViewportRestore;\n            this._pendingViewportRestore = null;\n            if (pending.priceScale) {\n                this.priceScaleFactor = pending.priceScale.factor;\n                this.pricePanOffset = pending.priceScale.panOffset;\n                this._displayedPriceRange = null;\n                this._lockedAutoFitBase = null;\n            }\n            if (pending.viewport) {\n                this.applyViewportFromTimestamps(\n                    pending.viewport.startTime,\n                    pending.viewport.endTime\n                );\n            }\n        }\n        this.updateCountdownState();\n        this.scheduleRender();\n        return this;\n    }\n\n    /** Prepends historical bars before the current dataset without a visual jump. */\n    prependData(bars: OHLCVBar[]): this {\n        if (bars.length === 0) {\n            this.noMoreData = true;\n            this.isFetching = false;\n            return this;\n        }\n        const n = this.dataStore.prepend(bars);\n        if (n > 0) {\n            this.viewport = {\n                ...this.viewport,\n                startIndex: this.viewport.startIndex + n,\n                endIndex: this.viewport.endIndex + n,\n            };\n            this._targetViewport = { ...this.viewport };\n            this.drawingManager.shiftBarIndices(n);\n            this.reanchorDrawingsByTimestamp();\n            this.recomputeIndicators();\n            this.scheduleRender();\n        }\n        this.isFetching = false;\n        return this;\n    }\n\n    /** Shows or hides the loading overlay. */\n    setLoading(loading: boolean): this {\n        if (this.loadingOverlayEl) {\n            this.loadingOverlayEl.style.display = loading ? 'flex' : 'none';\n        }\n        if (loading) this.setNoData(false);\n        return this;\n    }\n\n    /** Shows or hides the \"No data available\" overlay. */\n    private setNoData(show: boolean): this {\n        if (this.noDataOverlayEl) {\n            this.noDataOverlayEl.style.display = show ? 'flex' : 'none';\n        }\n        return this;\n    }\n\n    // ── Data loading helpers ──────────────────────────────────────────────────\n\n    private timeframeToMs(tf: Timeframe): number {\n        const MIN = 60_000;\n        const map: Record<Timeframe, number> = {\n            '1m': 1 * MIN,\n            '5m': 5 * MIN,\n            '15m': 15 * MIN,\n            '30m': 30 * MIN,\n            '1h': 60 * MIN,\n            '2h': 120 * MIN,\n            '4h': 240 * MIN,\n            '8h': 480 * MIN,\n            '1D': 1440 * MIN,\n            '1W': 10080 * MIN,\n            '1M': 43200 * MIN,\n        };\n        return map[tf] ?? 1440 * MIN;\n    }\n\n    /** Returns the base interval to request from the dataLoader for the current timeframe.\n     *  Falls back to the current timeframe itself when no mapping is configured. */\n    private getBaseInterval(): Timeframe {\n        return this.aggregateFrom?.[this.timeframe] ?? this.timeframe;\n    }\n\n    /** Returns true when the base interval is finer than the target timeframe,\n     *  meaning the fetched bars must be aggregated before rendering. */\n    private shouldAggregate(): boolean {\n        const base = this.getBaseInterval();\n        return (\n            base !== this.timeframe && this.timeframeToMs(base) < this.timeframeToMs(this.timeframe)\n        );\n    }\n\n    /** Aggregates bars if shouldAggregate(), otherwise returns them unchanged. */\n    private maybeAggregate(bars: OHLCVBar[]): OHLCVBar[] {\n        return this.shouldAggregate()\n            ? aggregateCandles(bars, this.timeframeToMs(this.timeframe))\n            : bars;\n    }\n\n    private timeframeToInterval(tf: Timeframe): string {\n        const map: Record<Timeframe, string> = {\n            '1m': '1min',\n            '5m': '5min',\n            '15m': '15min',\n            '30m': '30min',\n            '1h': '1h',\n            '2h': '2h',\n            '4h': '4h',\n            '8h': '8h',\n            '1D': '1day',\n            '1W': '1week',\n            '1M': '1month',\n        };\n        return map[tf] ?? '1day';\n    }\n\n    private durationToMs(d: Duration): number {\n        const DAY = 24 * 60 * 60 * 1000;\n        const map: Record<Duration, number> = {\n            '1D': 1 * DAY,\n            '5D': 5 * DAY,\n            '1M': 30 * DAY,\n            '3M': 90 * DAY,\n            '6M': 180 * DAY,\n            '1Y': 365 * DAY,\n            '5Y': 5 * 365 * DAY,\n            All: 20 * 365 * DAY,\n        };\n        return map[d] ?? 365 * DAY;\n    }\n\n    private triggerLoad(reason: 'initial' | 'timeframe' | 'duration'): void {\n        if (!this.dataLoader) return;\n        const gen = ++this._loadGeneration;\n        this._suppressTicks = true;\n        this.isFetching = true;\n        this.noMoreData = false;\n        const end = new Date();\n        const maxCandleMs = this.maxCandles * this.timeframeToMs(this.timeframe);\n        const durationMs = this.duration ? this.durationToMs(this.duration) : maxCandleMs;\n        const baseWindowMs = Math.min(durationMs, maxCandleMs);\n        const interval = this.timeframeToInterval(this.getBaseInterval());\n        this.setLoading(true);\n\n        const loader = this.dataLoader;\n        const expansionFactors = [1, 5, 25, 125];\n        const minBars = this.minInitialBars;\n        const cap = this.maxLookbackMs;\n\n        const attempt = (i: number, start: Date): void => {\n            loader({ start, end, interval })\n                .then((bars) => {\n                    if (gen !== this._loadGeneration) return;\n                    const aggregated = this.maybeAggregate(bars);\n                    const reachedCap = end.getTime() - start.getTime() >= cap;\n                    if (aggregated.length >= minBars || i + 1 >= expansionFactors.length || reachedCap) {\n                        this.loadData(aggregated, reason === 'duration');\n                        this.setLoading(false);\n                        if (aggregated.length === 0) this.setNoData(true);\n                        this.emitter.emit('dataLoaded', {\n                            timeframe: this.timeframe,\n                            interval,\n                            start,\n                            end,\n                        });\n                        return;\n                    }\n                    const nextWindowMs = Math.min(baseWindowMs * expansionFactors[i + 1], cap);\n                    const nextStart = new Date(end.getTime() - nextWindowMs);\n                    attempt(i + 1, nextStart);\n                })\n                .catch(() => {\n                    if (gen !== this._loadGeneration) return;\n                    this.isFetching = false;\n                    this.setLoading(false);\n                });\n        };\n\n        const firstWindowMs = Math.min(baseWindowMs * expansionFactors[0], cap);\n        attempt(0, new Date(end.getTime() - firstWindowMs));\n    }\n\n    private checkNeedMoreData(): void {\n        if (!this.dataLoader || this.isFetching || this.noMoreData) return;\n        const threshold = Math.max(20, this.prefetchThreshold);\n        if (this._targetViewport.startIndex > threshold) return;\n        if (this.dataStore.length === 0) return;\n\n        const gen = this._loadGeneration;\n        this.isFetching = true;\n        const before = this.dataStore.all[0].time;\n        const end = new Date(before - 1);\n        const maxCandleMs = this.maxCandles * this.timeframeToMs(this.timeframe);\n        const durationMs = this.duration ? this.durationToMs(this.duration) : maxCandleMs;\n        const baseWindowMs = Math.min(durationMs, maxCandleMs);\n        const interval = this.timeframeToInterval(this.getBaseInterval());\n        this.setLoading(true);\n\n        const loader = this.dataLoader;\n        const expansionFactors = [1, 5, 25, 125];\n        const minBars = this.minInitialBars;\n        const cap = this.maxLookbackMs;\n\n        const attempt = (i: number, start: Date): void => {\n            loader({ start, end, interval })\n                .then((bars) => {\n                    if (gen !== this._loadGeneration) return;\n                    const aggregated = this.maybeAggregate(bars);\n                    const reachedCap = end.getTime() - start.getTime() >= cap;\n                    if (aggregated.length >= minBars || i + 1 >= expansionFactors.length || reachedCap) {\n                        this.prependData(aggregated);\n                        this.setLoading(false);\n                        return;\n                    }\n                    const nextWindowMs = Math.min(baseWindowMs * expansionFactors[i + 1], cap);\n                    const nextStart = new Date(end.getTime() - nextWindowMs);\n                    attempt(i + 1, nextStart);\n                })\n                .catch(() => {\n                    if (gen !== this._loadGeneration) return;\n                    this.isFetching = false;\n                    this.setLoading(false);\n                });\n        };\n\n        const firstWindowMs = Math.min(baseWindowMs * expansionFactors[0], cap);\n        attempt(0, new Date(end.getTime() - firstWindowMs));\n    }\n\n    addIndicator(indicator: IIndicator): this {\n        if (indicator.pane === 'sub') {\n            const subPaneCount = this.activeIndicators.filter(\n                (s) => s.indicator.pane === 'sub'\n            ).length;\n            if (subPaneCount >= this.maxSubPanes) return this;\n        }\n        const schema = INDICATOR_PARAM_SCHEMAS.find((s) => s.shortName === indicator.name);\n        const defaultParams: IndicatorParams = schema\n            ? Object.fromEntries(schema.fields.map((f) => [f.key, f.default]))\n            : {};\n        defaultParams['timeframe'] = 'Chart';\n        const state: ActiveIndicatorState = {\n            indicator,\n            shortName: indicator.name,\n            currentParams: defaultParams,\n            visible: true,\n        };\n        this.activeIndicators.push(state);\n        if (this.dataStore.length > 0) {\n            this.indicatorResults.set(indicator.name, indicator.compute(this.dataStore.all));\n        }\n        const hasSettings = schema !== undefined && schema.fields.length > 0;\n        const label = buildIndicatorLabel(indicator.name, defaultParams, schema);\n        if (indicator.pane === 'sub') {\n            // Sub-pane indicators get their own overlay positioned within the sub-pane\n            const paneOverlay = new IndicatorOverlay(\n                this.theme,\n                this.uiConfig.indicatorOverlay,\n                this.labels.chart\n            );\n            Object.assign(paneOverlay.el.style, {\n                position: 'absolute',\n                top: '6px',\n                left: '6px',\n                zIndex: '10',\n            });\n            this.canvasWrap.appendChild(paneOverlay.el);\n            this.subPaneOverlays.set(indicator.name, paneOverlay);\n            paneOverlay.addPill(\n                indicator.name,\n                indicator.color,\n                label,\n                'Chart',\n                true,\n                () => this.removeIndicator(indicator.name),\n                hasSettings ? () => this.openIndicatorSettings(indicator.name) : null,\n                () => {\n                    state.visible = !state.visible;\n                    paneOverlay.updatePillVisibility(indicator.name, state.visible);\n                    this.scheduleRender();\n                    this.emitStateChange();\n                }\n            );\n        } else {\n            this.indicatorOverlay?.addPill(\n                indicator.name,\n                indicator.color,\n                label,\n                'Chart',\n                true,\n                () => this.removeIndicator(indicator.name),\n                hasSettings ? () => this.openIndicatorSettings(indicator.name) : null,\n                () => {\n                    state.visible = !state.visible;\n                    this.indicatorOverlay?.updatePillVisibility(indicator.name, state.visible);\n                    this.scheduleRender();\n                    this.emitStateChange();\n                }\n            );\n        }\n        this.topBar?.setIndicatorOptionActive(indicator.name, true);\n        this.scheduleRender();\n        this.emitStateChange();\n        return this;\n    }\n\n    removeIndicator(name: string): this {\n        this.activeIndicators = this.activeIndicators.filter((s) => s.indicator.name !== name);\n        this.indicatorResults.delete(name);\n        this.subPaneScaleFactors.delete(name);\n        const subOverlay = this.subPaneOverlays.get(name);\n        if (subOverlay) {\n            subOverlay.destroy();\n            subOverlay.el.remove();\n            this.subPaneOverlays.delete(name);\n        } else {\n            this.indicatorOverlay?.removePill(name);\n        }\n        this.topBar?.setIndicatorOptionActive(name, false);\n        this.scheduleRender();\n        this.emitStateChange();\n        return this;\n    }\n\n    addIndicatorByName(shortName: string): void {\n        // VOL is a special case: toggle the volume bars panel\n        if (shortName === 'VOL') {\n            this.setVolume(!this.showVolume);\n            if (this.showVolume) {\n                this.indicatorOverlay?.addPill(\n                    'VOL',\n                    this.theme.volume.up,\n                    'VOL',\n                    'Chart',\n                    true,\n                    () => {\n                        this.setVolume(false);\n                        this.indicatorOverlay?.removePill('VOL');\n                        this.topBar?.setVolumeControl(false, this.dataStore.hasVolumeData);\n                    },\n                    null,\n                    () => {\n                        this.setVolume(!this.showVolume);\n                        this.indicatorOverlay?.updatePillVisibility('VOL', this.showVolume);\n                        this.scheduleRender();\n                    }\n                );\n            } else {\n                this.indicatorOverlay?.removePill('VOL');\n            }\n            this.topBar?.setVolumeControl(this.showVolume, this.dataStore.hasVolumeData);\n            return;\n        }\n        const preset = INDICATOR_PRESETS.find((p) => p.shortName === shortName);\n        if (!preset) return;\n        // Toggle off if already active\n        if (this.activeIndicators.some((s) => s.shortName === shortName)) {\n            this.removeIndicator(shortName);\n            return;\n        }\n        this.addIndicator(preset.factory());\n    }\n\n    private openIndicatorSettings(shortName: string): void {\n        const state = this.activeIndicators.find((s) => s.shortName === shortName);\n        if (!state) return;\n        const schema = INDICATOR_PARAM_SCHEMAS.find((s) => s.shortName === shortName);\n        if (!schema || schema.fields.length === 0) return;\n        const augmentedSchema = { ...schema, fields: [...schema.fields, TIMEFRAME_FIELD] };\n        this.indicatorSettingsDialog?.show(\n            augmentedSchema,\n            state.currentParams,\n            (newParams) => this.updateIndicatorParams(shortName, newParams),\n            () => this.removeIndicator(shortName)\n        );\n    }\n\n    private updateIndicatorParams(shortName: string, newParams: IndicatorParams): void {\n        const stateIdx = this.activeIndicators.findIndex((s) => s.shortName === shortName);\n        if (stateIdx === -1) return;\n        const schema = INDICATOR_PARAM_SCHEMAS.find((s) => s.shortName === shortName);\n        if (!schema) return;\n\n        const prevState = this.activeIndicators[stateIdx];\n        if (!prevState) return;\n        // Strip the injected timeframe key before passing to factory (schema doesn't know it)\n        const { timeframe: tf, ...factoryParams } = newParams;\n        const newIndicator = schema.factory(factoryParams);\n        // Mutate in place so the toggle closure in addIndicator (which captured the\n        // original state object by reference) continues to read/write the correct object.\n        prevState.indicator = newIndicator;\n        prevState.currentParams = { ...newParams };\n\n        this.indicatorResults.delete(shortName);\n        if (this.dataStore.length > 0) {\n            this.indicatorResults.set(shortName, newIndicator.compute(this.dataStore.all));\n        }\n\n        const pillOverlay = this.subPaneOverlays.get(shortName) ?? this.indicatorOverlay;\n        pillOverlay?.updatePillColor(shortName, newIndicator.color);\n        pillOverlay?.updatePillLabel(\n            shortName,\n            buildIndicatorLabel(shortName, prevState.currentParams, schema)\n        );\n        pillOverlay?.updatePillTimeframe(shortName, (tf as string) ?? 'Chart');\n        this.scheduleRender();\n        this.emitStateChange();\n    }\n\n    on<K extends keyof ChartEventMap>(event: K, listener: (payload: ChartEventMap[K]) => void) {\n        return this.emitter.on(event, listener);\n    }\n\n    private buildTheme(mode: 'dark' | 'light'): ChartTheme {\n        const base = mode === 'dark' ? DARK_THEME : LIGHT_THEME;\n        const c = this.settingsCanvasColors[mode];\n        const userOverride: DeepPartialChartTheme | undefined = c\n            ? {\n                  ...(c.background !== undefined && { background: c.background }),\n                  ...(c.grid !== undefined && { grid: c.grid }),\n                  ...(c.axisText !== undefined && { axisText: c.axisText }),\n                  ...(c.axisBorder !== undefined && { axisBorder: c.axisBorder }),\n                  ...(c.crosshair !== undefined && { crosshair: c.crosshair }),\n                  ...((c.candleUp ??\n                      c.candleDown ??\n                      c.wickUp ??\n                      c.wickDown ??\n                      c.borderUp ??\n                      c.borderDown) !== undefined && {\n                      candle: {\n                          ...(c.candleUp !== undefined && { up: c.candleUp }),\n                          ...(c.candleDown !== undefined && { down: c.candleDown }),\n                          ...(c.wickUp !== undefined && { wickUp: c.wickUp }),\n                          ...(c.wickDown !== undefined && { wickDown: c.wickDown }),\n                          ...(c.borderUp !== undefined && { borderUp: c.borderUp }),\n                          ...(c.borderDown !== undefined && { borderDown: c.borderDown }),\n                      },\n                  }),\n                  ...((c.volumeUp ?? c.volumeDown) !== undefined && {\n                      volume: {\n                          ...(c.volumeUp !== undefined && { up: c.volumeUp }),\n                          ...(c.volumeDown !== undefined && { down: c.volumeDown }),\n                      },\n                  }),\n              }\n            : undefined;\n        const merged = deepMergeTheme(\n            deepMergeTheme(base, this.themeOverrides?.[mode]),\n            userOverride\n        );\n        return resolveCssVarsInTheme(merged, this.wrapper);\n    }\n\n    setTheme(theme: 'dark' | 'light'): this {\n        this.themeName = theme;\n        this.theme = this.buildTheme(theme);\n        this.topBar?.setTheme(this.theme);\n        this.bottomBar?.setTheme(this.theme);\n        this.leftBar?.setTheme(this.theme);\n        this.tradeButton?.setTheme(this.theme, this.priceAxisWidth);\n        this.tradePopover?.setTheme(this.theme);\n        this.drawingStylePopover?.setTheme(this.theme);\n        this._draftQtyFlyout?.setTheme(this.theme);\n        this.indicatorSettingsDialog?.setTheme(this.theme);\n        this.chartSettingsDialog?.setTheme(this.theme);\n        this.applyScrollToEndBtnStyles();\n        this.applyResetViewBtnStyles();\n        this.applyMobileDrawingFlyoutTheme();\n        if (this.siSymbolSpan) this.siSymbolSpan.style.color = this.theme.axisText;\n        if (this.siStreamDot) this.siStreamDot.style.background = this.theme.ui.stream.disconnected;\n        this.scheduleRender();\n        this.emitStateChange();\n        return this;\n    }\n\n    /** Programmatically change the active timeframe and reload data. */\n    setTimeframe(tf: Timeframe): this {\n        this.timeframe = tf;\n        this.topBar?.setTimeframe(tf);\n        this.emitter.emit('timeframeChange', { timeframe: tf });\n        this.emitStateChange();\n        this.updateCountdownState();\n        this.triggerLoad('timeframe');\n        return this;\n    }\n\n    /** Update per-theme deep-partial color overrides and rebuild the active theme. */\n    setThemeOverrides(overrides: ChartConfig['themeOverrides']): this {\n        this.themeOverrides = overrides;\n        this.theme = this.buildTheme(this.themeName);\n        this.topBar?.setTheme(this.theme);\n        this.bottomBar?.setTheme(this.theme);\n        this.leftBar?.setTheme(this.theme);\n        this.tradeButton?.setTheme(this.theme, this.priceAxisWidth);\n        this.tradePopover?.setTheme(this.theme);\n        this.drawingStylePopover?.setTheme(this.theme);\n        this._draftQtyFlyout?.setTheme(this.theme);\n        this.indicatorSettingsDialog?.setTheme(this.theme);\n        this.chartSettingsDialog?.setTheme(this.theme);\n        this.scheduleRender();\n        return this;\n    }\n\n    /**\n     * Changes the display timezone for all time-axis and crosshair labels.\n     * Accepts any IANA string (e.g. `\"America/New_York\"`), `\"UTC\"`, or `\"local\"`.\n     */\n    setTimezone(tz: string): this {\n        this.timezone = tz === 'local'\n            ? Intl.DateTimeFormat().resolvedOptions().timeZone\n            : tz;\n        this.scheduleRender();\n        return this;\n    }\n\n    setSeries(series: SeriesType): this {\n        this.series = series;\n        this.topBar?.setSeries(series);\n        this.emitter.emit('seriesChange', { series });\n        this.scheduleRender();\n        this.emitStateChange();\n        return this;\n    }\n\n    /**\n     * Toggle TFC (Trade from Charts) on or off at runtime.\n     * When disabled, all trade levels, the trade button, and trade popover are hidden.\n     * Only functional when `tfcEnabled` config option is `true` (default).\n     */\n    setTfcActive(enabled: boolean): this {\n        if (!this.tfcEnabled) return this;\n        this.tfcActive = enabled;\n        this.topBar?.setTfcActive(enabled);\n        if (!enabled) {\n            this.tradeButton?.hide();\n            this.tradePopover?.hide();\n            if (this.draftOrderLabel !== null) {\n                this.removeDraftOrder();\n            }\n        }\n        // Destroy cached settings dialog so the TFC section visibility updates on next open\n        if (this.chartSettingsDialog) {\n            this.chartSettingsDialog.destroy();\n            this.chartSettingsDialog = null;\n        }\n        this.renderTradeLayer();\n        this.emitter.emit('tfcToggle', { enabled });\n        this.emitStateChange();\n        return this;\n    }\n\n    private clearDuration(): void {\n        if (this.duration === undefined) return;\n        this.duration = undefined;\n        this.topBar?.setActiveDuration(undefined);\n        this.bottomBar?.setActive(undefined);\n        this.emitStateChange();\n    }\n\n    setVolume(show: boolean): this {\n        this.showVolume = show;\n        this.scheduleRender();\n        this.emitStateChange();\n        return this;\n    }\n\n    // ── Dismissible UI (flyouts, modals, dropdowns) ──────────────────────────\n\n    /**\n     * Dismisses all open flyouts, modals, dropdowns, and popovers in one call.\n     * Intended for wiring to platform back events: Android hardware back button,\n     * iOS swipe-back / custom back action, or PWA `popstate`.\n     *\n     * @returns `true` if at least one UI element was dismissed, `false` if\n     *          nothing was open. Hosts should consume the back event only when\n     *          this returns `true` — otherwise let the event propagate so the\n     *          Activity / view can handle it normally.\n     */\n    dismissAllUI(): boolean {\n        if (!this.isAnyUIOpen()) return false;\n        this._draftQtyFlyout?.hide();\n        this.isinPickerModal?.hide();\n        this.indicatorSettingsDialog?.hide();\n        this.chartSettingsDialog?.hide();\n        this.tradePopover?.hide();\n        this.topBar?.closeDropdown();\n        this.hideMobileDrawingFlyout();\n        return true;\n    }\n\n    /** True when any dismissible UI (flyout, modal, dropdown, popover) is currently open. */\n    private isAnyUIOpen(): boolean {\n        return (\n            this._draftQtyFlyout?.isVisible === true ||\n            this.isinPickerModal?.isVisible === true ||\n            this.indicatorSettingsDialog?.isVisible === true ||\n            this.chartSettingsDialog?.isVisible === true ||\n            this.tradePopover?.isVisible === true ||\n            this.topBar?.hasOpenDropdown === true ||\n            (this._mobileDrawingFlyout?.style.display ?? 'none') !== 'none'\n        );\n    }\n\n    /** Emitted by each UI component via its visibility callback. */\n    private emitUiState(): void {\n        this.emitter.emit('uiStateChange', { hasOpenUI: this.isAnyUIOpen() });\n    }\n\n    // ── State persistence ─────────────────────────────────────────────────────\n\n    private isRestoringState = false;\n\n    private emitStateChange(): void {\n        if (this.isRestoringState) return;\n        this.emitter.emit('stateChange', { symbol: this.symbol, state: this.getState() });\n    }\n\n    /**\n     * Returns a full serializable snapshot of the current chart configuration.\n     * Includes timeframe, chart type, active indicators (with params), and drawings.\n     */\n    getState(): ChartState {\n        return {\n            symbol: this.symbol,\n            timeframe: this.timeframe,\n            duration: this.duration,\n            series: this.series,\n            showVolume: this.showVolume,\n            theme: this.themeName,\n            indicators: this.activeIndicators.map((s) => ({\n                shortName: s.shortName,\n                params: { ...s.currentParams },\n                visible: s.visible,\n            })),\n            drawings: this.drawingManager.getDrawingsSnapshot().map((d) => ({\n                ...d,\n                points: d.points.map((p) => ({\n                    ...p,\n                    // Prefer the point's own timestamp (captured at placement / drag /\n                    // resize); only derive from current bars as a fallback for legacy\n                    // points. Re-deriving on every export would otherwise corrupt the\n                    // anchor after a timeframe change has staled the cached barIndex.\n                    timestamp: p.timestamp ?? this.barIndexToTimestamp(p.barIndex),\n                })),\n            })),\n            positionRenderStyle: this.positionRenderStyle,\n            tradeDisplayFilter: this.tradeDisplayFilter,\n            canvasColors:\n                Object.keys(this.settingsCanvasColors).length > 0\n                    ? { ...this.settingsCanvasColors }\n                    : undefined,\n            tfcEnabled: this.tfcActive,\n            viewport: this.getViewportTimestamps(),\n            priceScale:\n                this.priceScaleFactor !== 1.0 || this.pricePanOffset !== 0\n                    ? { factor: this.priceScaleFactor, panOffset: this.pricePanOffset }\n                    : undefined,\n        };\n    }\n\n    /**\n     * Captures the current viewport as a {startTime, endTime} timestamp pair,\n     * preserving sub-bar fractional position. Returns undefined only when no\n     * bars are loaded (viewport has no meaningful time anchor).\n     */\n    private getViewportTimestamps(): { startTime: number; endTime: number } | undefined {\n        if (this.dataStore.all.length === 0) return undefined;\n        const startTime = this.barIndexToTimestamp(this.viewport.startIndex);\n        const endTime = this.barIndexToTimestamp(this.viewport.endIndex);\n        if (startTime == null || endTime == null) return undefined;\n        return { startTime, endTime };\n    }\n\n    /**\n     * Restores the viewport from a timestamp pair, converting each edge back\n     * into a fractional bar index relative to the current dataStore. Callers\n     * must ensure bars are loaded before invoking.\n     */\n    private applyViewportFromTimestamps(startTime: number, endTime: number): void {\n        const startIndex = this.timestampToBarIndex(startTime);\n        const endIndex = this.timestampToBarIndex(endTime);\n        this.viewport = { ...this.viewport, startIndex, endIndex };\n        this._targetViewport = { ...this.viewport };\n    }\n\n    /**\n     * Restores chart configuration from a previously captured `ChartState`.\n     * Call this after construction to hydrate a chart from persisted state.\n     */\n    setState(state: ChartState): this {\n        this.isRestoringState = true;\n        try {\n            // Series, volume, theme\n            this.setSeries(state.series);\n            this.setVolume(state.showVolume);\n            // Only apply theme/timeframe when explicitly present — partial state objects\n            // (e.g. from buildChartStateJsonForSymbol) omit these fields, and treating\n            // undefined as a value would reset theme to light and blank the timeframe picker.\n            if (state.theme != null) this.setTheme(state.theme);\n\n            // Timeframe & duration — set directly to avoid triggering a data reload\n            if (state.timeframe != null) {\n                this.timeframe = state.timeframe;\n                this.duration = state.duration;\n                this.topBar?.setTimeframe(state.timeframe);\n                this.topBar?.setActiveDuration(state.duration);\n                this.bottomBar?.setActive(state.duration);\n                this.updateCountdownState();\n            }\n\n            // Indicators — clear existing and re-add from state\n            const existingNames = this.activeIndicators.map((s) => s.shortName);\n            for (const name of existingNames) {\n                this.removeIndicator(name);\n            }\n            for (const entry of state.indicators) {\n                const schema = INDICATOR_PARAM_SCHEMAS.find((s) => s.shortName === entry.shortName);\n                if (schema) {\n                    const indicator = schema.factory(entry.params);\n                    this.addIndicator(indicator);\n                    // Sync params and visibility to what was stored\n                    const idx = this.activeIndicators.findIndex(\n                        (s) => s.shortName === entry.shortName\n                    );\n                    if (idx !== -1) {\n                        const st = this.activeIndicators[idx];\n                        if (st) {\n                            st.currentParams = { ...entry.params };\n                            if (entry.visible === false) {\n                                st.visible = false;\n                                const restoreOverlay =\n                                    this.subPaneOverlays.get(entry.shortName) ??\n                                    this.indicatorOverlay;\n                                restoreOverlay?.updatePillVisibility(entry.shortName, false);\n                            }\n                            const tf = (entry.params['timeframe'] as string) ?? 'Chart';\n                            const tfOverlay =\n                                this.subPaneOverlays.get(entry.shortName) ?? this.indicatorOverlay;\n                            tfOverlay?.updatePillTimeframe(entry.shortName, tf);\n                        }\n                    }\n                }\n            }\n\n            // Drawings — re-anchor each point by timestamp when data is already\n            // loaded. If data isn't loaded yet (common restore-before-fetch case),\n            // keep the raw barIndex; loadData() will call reanchorDrawingsByTimestamp\n            // once bars arrive to correct any drift from the saved cached barIndex.\n            const resolvedDrawings = state.drawings.map((d) => ({\n                ...d,\n                points: d.points.map((p) => {\n                    if (p.timestamp == null || this.dataStore.all.length === 0) return p;\n                    return { ...p, barIndex: this.timestampToBarIndex(p.timestamp) };\n                }),\n            }));\n            this.drawingManager.loadDrawings(resolvedDrawings);\n\n            // Settings dialog state\n            if (state.positionRenderStyle) {\n                this.positionRenderStyleOverride = state.positionRenderStyle;\n                this.positionRenderStyle = state.positionRenderStyle;\n            }\n            if (state.tradeDisplayFilter) {\n                this.tradeDisplayFilter = state.tradeDisplayFilter;\n            }\n            if (state.canvasColors) {\n                this.settingsCanvasColors = state.canvasColors;\n            }\n            if (state.tfcEnabled !== undefined && this.tfcEnabled) {\n                this.tfcActive = state.tfcEnabled;\n                this.topBar?.setTfcActive(state.tfcEnabled);\n            }\n\n            // Viewport & price-scale restore.\n            //   • Price scale is data-independent — apply immediately.\n            //   • Viewport needs data loaded to convert timestamps → bar indexes;\n            //     if bars aren't ready yet, stash for loadData() to apply.\n            if (state.priceScale) {\n                this.priceScaleFactor = state.priceScale.factor;\n                this.pricePanOffset = state.priceScale.panOffset;\n                this._displayedPriceRange = null;\n                this._lockedAutoFitBase = null;\n            }\n            if (state.viewport) {\n                if (this.dataStore.all.length > 0) {\n                    this.applyViewportFromTimestamps(\n                        state.viewport.startTime,\n                        state.viewport.endTime\n                    );\n                } else {\n                    this._pendingViewportRestore = {\n                        viewport: state.viewport,\n                        priceScale: state.priceScale,\n                    };\n                }\n            }\n        } finally {\n            this.isRestoringState = false;\n        }\n\n        this.emitStateChange();\n        this.scheduleRender();\n        return this;\n    }\n\n    /**\n     * Converts a fractional barIndex into an absolute unix-ms timestamp by\n     * interpolating across the containing bar. Extrapolates linearly for indexes\n     * outside [0, bars.length-1] using the adjacent bar's width.\n     *\n     * This is the inverse of `timestampToBarIndex` and the authoritative way to\n     * capture \"where in time\" a drawing point sits at placement, drag, or resize.\n     * Returns undefined only when no bars are loaded.\n     */\n    private barIndexToTimestamp(idx: number): number | undefined {\n        const bars = this.dataStore.all;\n        const n = bars.length;\n        if (n === 0) return undefined;\n        const first = bars[0];\n        if (!first) return undefined;\n        if (n === 1) return first.time;\n        const floorIdx = Math.floor(idx);\n        const frac = idx - floorIdx;\n        if (floorIdx < 0) {\n            const second = bars[1];\n            if (!second) return first.time;\n            return first.time + idx * (second.time - first.time);\n        }\n        if (floorIdx >= n - 1) {\n            const last = bars[n - 1];\n            const prev = bars[n - 2];\n            if (!last || !prev) return first.time;\n            return last.time + (idx - (n - 1)) * (last.time - prev.time);\n        }\n        const lo = bars[floorIdx];\n        const hi = bars[floorIdx + 1];\n        if (!lo || !hi) return first.time;\n        return lo.time + frac * (hi.time - lo.time);\n    }\n\n    /**\n     * Converts a unix-ms timestamp into a fractional barIndex using floor-bar\n     * containment: the result is `floorBar + (ts - floorBar.time) / (nextBar.time - floorBar.time)`.\n     * Extrapolates linearly for timestamps outside the loaded range using the edge\n     * bar width, so drawings outside the visible data still render at the correct\n     * relative offset rather than snapping to an edge.\n     *\n     * Matches TradingView's floor-bar semantics and preserves sub-bar time\n     * precision across timeframe changes.\n     */\n    private timestampToBarIndex(ts: number): number {\n        const bars = this.dataStore.all;\n        const n = bars.length;\n        if (n === 0) return 0;\n        const first = bars[0];\n        if (!first) return 0;\n        if (n === 1) return 0;\n        if (ts <= first.time) {\n            const second = bars[1];\n            if (!second) return 0;\n            const barMs = second.time - first.time;\n            return barMs > 0 ? (ts - first.time) / barMs : 0;\n        }\n        const lastIdx = n - 1;\n        const lastBar = bars[lastIdx];\n        const prevBar = bars[lastIdx - 1];\n        if (!lastBar || !prevBar) return 0;\n        if (ts >= lastBar.time) {\n            const barMs = lastBar.time - prevBar.time;\n            return lastIdx + (barMs > 0 ? (ts - lastBar.time) / barMs : 0);\n        }\n        // Binary search for the floor bar — largest index where bars[i].time <= ts.\n        let lo = 0,\n            hi = lastIdx;\n        while (lo < hi) {\n            const mid = (lo + hi + 1) >> 1;\n            if ((bars[mid]?.time ?? 0) <= ts) lo = mid;\n            else hi = mid - 1;\n        }\n        const loBar = bars[lo];\n        const hiBar = bars[lo + 1];\n        if (!loBar || !hiBar) return lo;\n        const barMs = hiBar.time - loBar.time;\n        return lo + (barMs > 0 ? (ts - loBar.time) / barMs : 0);\n    }\n\n    /**\n     * Re-anchors all loaded drawings to the current dataset. For points with a\n     * stored timestamp, barIndex is recomputed via `timestampToBarIndex`; for\n     * points missing a timestamp (legacy saves or freshly placed points whose\n     * timestamp capture was skipped), the timestamp is backfilled from the\n     * current barIndex so subsequent data reloads remain accurate.\n     *\n     * Called after loadData(), prependData(), and whenever the underlying bars\n     * change such that cached barIndex values would otherwise drift.\n     */\n    private reanchorDrawingsByTimestamp(): void {\n        const bars = this.dataStore.all;\n        if (bars.length === 0) return;\n        for (const drawing of this.drawingManager.getDrawings()) {\n            for (const pt of drawing.points) {\n                if (pt.timestamp == null) {\n                    const t = this.barIndexToTimestamp(pt.barIndex);\n                    if (t != null) pt.timestamp = t;\n                    continue;\n                }\n                pt.barIndex = this.timestampToBarIndex(pt.timestamp);\n            }\n        }\n    }\n\n    /**\n     * Captures a timestamp on any drawing point that is missing one, using the\n     * current bars. Call this BEFORE mutating `dataStore.all` (insert/splice)\n     * so that points still pointing at a stale barIndex get frozen to the\n     * correct time before the mutation invalidates the index. Safe no-op for\n     * points that already have a timestamp.\n     */\n    private backfillDrawingTimestamps(): void {\n        if (this.dataStore.all.length === 0) return;\n        for (const drawing of this.drawingManager.getDrawings()) {\n            for (const pt of drawing.points) {\n                if (pt.timestamp != null) continue;\n                const t = this.barIndexToTimestamp(pt.barIndex);\n                if (t != null) pt.timestamp = t;\n            }\n        }\n    }\n\n    /**\n     * Resets all chart settings that are captured by `getState()` back to their\n     * defaults (candlestick / dark / 1D / 1Y / volume on / no indicators / no drawings)\n     * and emits a `stateChange` event so consumers can persist the cleared state.\n     */\n    resetChartSettings(): this {\n        this.setState({\n            symbol: this.symbol,\n            series: 'candlestick',\n            theme: 'dark',\n            timeframe: '1D',\n            duration: undefined,\n            showVolume: true,\n            indicators: [],\n            drawings: [],\n        });\n        this.positionRenderStyleOverride = null;\n        localStorage.removeItem(this.RENDER_STYLE_LS_KEY);\n        this.recomputeRenderStyle();\n        this.settingsCanvasColors = {};\n        this.setTheme('dark');\n        this.emitStateChange();\n        return this;\n    }\n\n    setSymbol(symbol: string): this {\n        this.symbol = symbol;\n        this.tradePopover?.setSymbol(symbol);\n        if (this.siSymbolSpan) {\n            this.siSymbolSpan.textContent = symbol;\n            this.siSymbolSpan.style.display = symbol ? 'inline' : 'none';\n        }\n        this.isinPickerModal?.setCurrentSymbol(symbol);\n        // Reset tick-activity indicator on symbol change\n        if (this.tickActivityTimer !== null) {\n            clearTimeout(this.tickActivityTimer);\n            this.tickActivityTimer = null;\n        }\n        if (this.siStreamDot)\n            this.siStreamDot.style.background = this.theme.ui.stream[this.streamStatus];\n        this.liveBidAsk = null;\n        return this;\n    }\n\n    /**\n     * Update the list of symbols available in the ISIN picker modal.\n     * Has no effect if the chart was not initialised with `isins` + `onIsinSelect`.\n     */\n    setIsins(isins: string[]): this {\n        this.isins = isins;\n        this.isinPickerModal?.setIsins(isins);\n        return this;\n    }\n\n    private renderSymbolInfoOHLC(bar: OHLCVBar | null): void {\n        if (!this.siOHLCSpan) return;\n        if (!bar) {\n            this.siOHLCSpan.innerHTML = '';\n            if (this.siOHLC2Span) this.siOHLC2Span.innerHTML = '';\n            return;\n        }\n        const up = bar.close >= bar.open;\n        const color = up ? this.theme.candle.up : this.theme.candle.down;\n        const fmt = (n: number) => n.toFixed(this.dataStore.getPricePrecision());\n        const fmtVol = (v: number) =>\n            v >= 1_000_000\n                ? (v / 1_000_000).toFixed(2) + 'M'\n                : v >= 1_000\n                  ? (v / 1_000).toFixed(1) + 'K'\n                  : v.toFixed(0);\n        const ol = this.labels.ohlc;\n        const renderFields = (el: HTMLSpanElement, fields: [string, string, string][]) => {\n            el.innerHTML = '';\n            for (const [lbl, val, clr] of fields) {\n                const span = document.createElement('span');\n                span.style.marginRight = '8px';\n                const key = document.createElement('span');\n                key.textContent = lbl + '\\u00A0';\n                key.style.color = this.theme.axisText;\n                key.style.opacity = '0.6';\n                const num = document.createElement('span');\n                num.textContent = val;\n                num.style.color = clr;\n                span.append(key, num);\n                el.appendChild(span);\n            }\n        };\n        renderFields(this.siOHLCSpan, [\n            [ol.open, fmt(bar.open), this.theme.axisText],\n            [ol.high, fmt(bar.high), this.theme.axisText],\n        ]);\n        if (this.siOHLC2Span) {\n            renderFields(this.siOHLC2Span, [\n                [ol.low, fmt(bar.low), this.theme.axisText],\n                [ol.close, fmt(bar.close), color],\n                ...(bar.volume != null && bar.volume !== 0\n                    ? [\n                          [ol.volume, fmtVol(bar.volume), this.theme.axisText] as [\n                              string,\n                              string,\n                              string,\n                          ],\n                      ]\n                    : []),\n            ]);\n        }\n    }\n\n    /**\n     * @deprecated Use `minLots` in the initial config or manage lot size externally.\n     * Updates the trade popover lot display and the submitted lot size. Will be removed in a future version.\n     */\n    setMinLots(lots: number): this {\n        // eslint-disable-next-line no-console\n        console.warn('[acttrader-charts] setMinLots() is deprecated. Pass minLots in the initial ChartConfig instead.');\n        this._minLots = lots;\n        this.tradePopover?.setLots(lots);\n        return this;\n    }\n\n    /**\n     * Updates the quantity (lots) shown in the draft order QTY pill and\n     * submitted when the order is confirmed.\n     * @param qty  Lot size to display and submit.\n     */\n    setDraftQty(qty: number): this {\n        if (this.draftOrderLabel) this.setLevelQty(this.draftOrderLabel, qty);\n        return this;\n    }\n\n    private setLevelQty(label: string, qty: number): void {\n        const idx = this.levels.findIndex((l) => l.label === label);\n        if (idx === -1) return;\n        const lvl = this.levels[idx] as PendingOrderLevel | PositionLevel;\n        if (lvl.lots === qty) return;\n        // Record original qty for revert (only on first change per edit session)\n        if (!this.originalQtyByLabel.has(label)) {\n            this.originalQtyByLabel.set(label, lvl.lots);\n        }\n        const previousLots = this.originalQtyByLabel.get(label) ?? lvl.lots ?? qty;\n        this.levels = [\n            ...this.levels.slice(0, idx),\n            { ...lvl, lots: qty } as AnyLevel,\n            ...this.levels.slice(idx + 1),\n        ];\n        // Track the new qty for non-draft levels so it can be included in tradeLevelEdit\n        if (label !== this.draftOrderLabel) {\n            this.pendingQtyChanges.set(label, qty);\n        }\n        this.emitter.emit('tradeLevelQtyChange', {\n            label,\n            type: label === this.draftOrderLabel ? 'draft' : (lvl.type as TradeLevelType),\n            newLots: qty,\n            previousLots,\n            isFullscreen: this.isFullscreen,\n        });\n        this.renderTradeLayer();\n    }\n\n    private openDraftQtyFlyout(pill: import('./overlays/TradeLevelOverlay.js').DraftQtyPillArea): void {\n        if (!this._draftQtyFlyout) {\n            this._draftQtyFlyout = new DraftQtyFlyout(\n                this.theme,\n                (qty) => {\n                    if (this._activeQtyPillLabel) this.setLevelQty(this._activeQtyPillLabel, qty);\n                },\n                () => this.emitUiState(),\n            );\n            this.getFloatingRoot().appendChild(this._draftQtyFlyout.el);\n        }\n        this._activeQtyPillLabel = pill.label;\n        const level = this.levels.find((l) => l.label === pill.label) as PendingOrderLevel | PositionLevel | undefined;\n        const currentQty = level?.lots ?? this._qtyFieldMin;\n        // Convert canvas-local CSS coords to viewport coords (flyout uses position:fixed on document.body)\n        const rect = this.canvasWrap.getBoundingClientRect();\n        const vpX = rect.left + pill.pillX;\n        const vpY = rect.top + pill.pillY + pill.pillH;\n        this._draftQtyFlyout.show(vpX, vpY, currentQty, this._qtyFieldMin, this._qtyFieldMax);\n    }\n\n    /**\n     * @deprecated DraftOrderQtyInput has been removed. This method is a no-op\n     * kept for backward compatibility. It will be removed in a future version.\n     */\n    setDraftOrderLabels(_labels: Record<string, string>): this {\n        // eslint-disable-next-line no-console\n        console.warn('[acttrader-charts] setDraftOrderLabels() is deprecated and is a no-op. DraftOrderQtyInput has been removed.');\n        return this;\n    }\n\n    setDrawingTool(tool: DrawingToolType | null): this {\n        this.drawingManager.setActiveTool(tool);\n        this.leftBar?.setActiveTool(tool);\n        this.drawCanvas.style.cursor = tool ? 'crosshair' : 'default';\n        this.scheduleRender();\n        return this;\n    }\n\n    undoDrawing(): this {\n        this.drawingManager.undo();\n        this.scheduleRender();\n        return this;\n    }\n\n    redoDrawing(): this {\n        this.drawingManager.redo();\n        this.scheduleRender();\n        return this;\n    }\n\n    hideAllDrawings(): this {\n        this.drawingManager.hideAll();\n        this.scheduleRender();\n        return this;\n    }\n\n    showAllDrawings(): this {\n        this.drawingManager.showAll();\n        this.scheduleRender();\n        return this;\n    }\n\n    lockAllDrawings(): this {\n        this.drawingManager.lockAll();\n        this.scheduleRender();\n        return this;\n    }\n\n    unlockAllDrawings(): this {\n        this.drawingManager.unlockAll();\n        this.scheduleRender();\n        return this;\n    }\n\n    deleteSelectedDrawing(): this {\n        this.drawingManager.deleteSelected();\n        this.hideMobileDrawingFlyout();\n        this.scheduleRender();\n        return this;\n    }\n\n    clearAllDrawings(): this {\n        this.drawingManager.clearAll();\n        this.scheduleRender();\n        return this;\n    }\n\n    getActiveTool(): DrawingToolType | null {\n        return this.drawingManager.getActiveTool();\n    }\n\n    /** Returns a copy of all current drawings as live IDrawing objects. */\n    getDrawings() {\n        return this.drawingManager.getDrawings();\n    }\n\n    /** Returns the drawing matching `id`, or null. */\n    getDrawingById(id: string) {\n        return this.drawingManager.getDrawingById(id);\n    }\n\n    /** Returns the currently selected drawing, or null. */\n    getSelectedDrawing() {\n        return this.drawingManager.getSelectedDrawing();\n    }\n\n    /**\n     * Shallow-merge a per-instance style override onto the drawing with `id`.\n     * Fib `levels` are deep-merged (per-key) so partial overrides keep siblings.\n     * Returns `this` for chaining.\n     */\n    updateDrawingStyle(id: string, patch: Partial<AnyDrawingStyle>): this {\n        this.drawingManager.updateDrawingStyle(id, patch);\n        this.scheduleRender();\n        return this;\n    }\n\n    connectStream(adapter: IWebSocketAdapter): this {\n        this.streamAdapter = adapter;\n        adapter.onTick((tick) => this.onTick(tick));\n        adapter.onStatus((status) => {\n            this.streamStatus = status;\n            if (this.siStreamDot) {\n                this.siStreamDot.style.background = this.theme.ui.stream[status];\n                this.siStreamDot.title = `Stream ${status}`;\n            }\n            this.emitter.emit('streamStatus', { status });\n        });\n        adapter.connect();\n        return this;\n    }\n\n    disconnectStream(): this {\n        this.streamAdapter?.disconnect();\n        this.streamAdapter = null;\n        return this;\n    }\n\n    /** Push a live bid/ask tick directly — no adapter needed.\n     *  Pass `T` from your feed as the server timestamp (ISO string or Unix ms)\n     *  to avoid system clock skew causing premature candle formation. */\n    pushTick(prices: { B: number; A: number; T?: string | number }): this {\n        const time =\n            prices.T != null\n                ? typeof prices.T === 'string'\n                    ? new Date(prices.T).getTime()\n                    : prices.T\n                : Date.now();\n        this.onTick({ time, bid: prices.B, ask: prices.A, volume: 0 });\n        return this;\n    }\n\n    // ── Trade / Position level API ────────────────────────────────────────────\n\n    /**\n     * Replace all levels of a given type and trigger a re-render.\n     * Pass an empty array to clear all levels of that type.\n     *\n     * @param data        Array of your domain objects (orders, positions, etc.)\n     * @param labelKey    Key whose value is shown as the level label\n     * @param priceKey    Key whose value is the entry/order price\n     * @param type        `'trade'` → solid line, no PnL; `'position'` → dashed line, optional PnL\n     * @param pnlKey      (positions only) Key whose numeric value determines PnL badge color\n     * @param pnlTextKey  (positions only) Key whose pre-formatted string is rendered verbatim in the box\n     */\n    setLevels<T extends Record<string, unknown>>(\n        data: T[],\n        labelKey: keyof T,\n        priceKey: keyof T,\n        type: TradeLevelType,\n        pnlKey?: keyof T,\n        pnlTextKey?: keyof T\n    ): this {\n        const newLevels: AnyLevel[] = data.map((d) => {\n            if (type === 'position') {\n                const level: PositionLevel = {\n                    label: String(d[labelKey]),\n                    price: Number(d[priceKey]),\n                    type: 'position',\n                    data: d,\n                };\n                if (d['text'] !== undefined) {\n                    level.text = String(d['text']);\n                }\n                if (pnlKey !== undefined && d[pnlKey] !== undefined) {\n                    level.pnl = Number(d[pnlKey]);\n                }\n                if (pnlTextKey !== undefined && d[pnlTextKey] !== undefined) {\n                    level.pnlText = String(d[pnlTextKey]);\n                }\n                if (d['side'] !== undefined) level.side = d['side'] as 'buy' | 'sell';\n                if (d['stopLossPrice'] !== undefined)\n                    level.stopLossPrice = Number(d['stopLossPrice']);\n                if (d['takeProfitPrice'] !== undefined)\n                    level.takeProfitPrice = Number(d['takeProfitPrice']);\n                if (d['entryPriceEditable']) level.entryPriceEditable = true;\n                if (d['orderType'] !== undefined)\n                    level.orderType = d['orderType'] as 'limit' | 'stop';\n                if (d['lots'] !== undefined) level.lots = Number(d['lots']);\n                return level;\n            }\n            if (type === 'pending') {\n                const level: PendingOrderLevel = {\n                    label: String(d[labelKey]),\n                    price: Number(d[priceKey]),\n                    type: 'pending',\n                    side: (d['side'] as 'buy' | 'sell') ?? 'buy',\n                    orderType: (d['orderType'] as 'limit' | 'stop') ?? 'limit',\n                    data: d,\n                };\n                if (d['text'] !== undefined) level.text = String(d['text']);\n                if (d['lots'] !== undefined) level.lots = Number(d['lots']);\n                if (d['stopLossPrice'] !== undefined)\n                    level.stopLossPrice = Number(d['stopLossPrice']);\n                if (d['takeProfitPrice'] !== undefined)\n                    level.takeProfitPrice = Number(d['takeProfitPrice']);\n                if (d['ToClose'] !== undefined) level.ToClose = String(d['ToClose']);\n                return level;\n            }\n            return {\n                label: String(d[labelKey]),\n                price: Number(d[priceKey]),\n                type: 'trade' as const,\n                text: d['text'] !== undefined ? String(d['text']) : undefined,\n                data: d,\n            };\n        });\n\n        // Mobile: auto-release pendingLevelDrags once the server confirms the dragged price.\n        // The entry was kept alive (not deleted in applyPendingChanges) so the level stays at\n        // the dragged position. When incoming data matches the dragged prices, the drag is done.\n        if (this.hideLevelConfirmCancel && this.pendingLevelDrags.size > 0) {\n            for (const level of newLevels) {\n                const pending = this.pendingLevelDrags.get(level.label);\n                if (!pending?.length) continue;\n                const ml = level as PositionLevel | PendingOrderLevel;\n                const allConfirmed = pending.every((c) => {\n                    if (c.isRemoval) {\n                        return c.field === 'stopLoss'\n                            ? ml.stopLossPrice === undefined\n                            : ml.takeProfitPrice === undefined;\n                    }\n                    if (c.field === 'main') return level.price === c.newPrice;\n                    if (c.field === 'stopLoss') return ml.stopLossPrice === c.newPrice;\n                    return ml.takeProfitPrice === c.newPrice;\n                });\n                if (allConfirmed) {\n                    this.pendingLevelDrags.delete(level.label);\n                    if (this.selectedTradeLabel === level.label) this.selectedTradeLabel = null;\n                }\n            }\n        }\n\n        // Preserve in-flight qty edits: if the user edited qty on a level and hasn't\n        // confirmed/cancelled yet, re-apply the pending value so the refresh doesn't\n        // flash it back to the server's original lots.\n        if (this.pendingQtyChanges.size > 0) {\n            for (let i = 0; i < newLevels.length; i++) {\n                const lvl = newLevels[i];\n                const pendingQty = this.pendingQtyChanges.get(lvl.label);\n                if (pendingQty === undefined) continue;\n                if (lvl.type !== 'pending' && lvl.type !== 'position') continue;\n                const ml = lvl as PendingOrderLevel | PositionLevel;\n                // Snapshot the server's current lots as the new \"original\" so revert\n                // lands on the latest server value rather than a stale one.\n                this.originalQtyByLabel.set(lvl.label, ml.lots);\n                newLevels[i] = { ...ml, lots: pendingQty } as AnyLevel;\n            }\n        }\n\n        // Preserve an active draft of this type — drafts are client-side only\n        // and never appear in server-sourced setLevels payloads. If the incoming\n        // data happens to contain a matching label, treat that as the draft being\n        // confirmed server-side and drop the preserved copy.\n        const preservedDraft =\n            this.draftOrderLabel !== null\n                ? this.levels.find(\n                      (l) =>\n                          l.type === type &&\n                          l.label === this.draftOrderLabel &&\n                          !newLevels.some((n) => n.label === l.label)\n                  )\n                : undefined;\n\n        this.levels = [\n            ...this.levels.filter((l) => l.type !== type),\n            ...newLevels,\n            ...(preservedDraft ? [preservedDraft] : []),\n        ];\n\n        // If the previously-selected level is no longer present after the refresh,\n        // clear the active/edit state so the overlay dismisses cleanly.\n        if (\n            this.selectedTradeLabel !== null &&\n            !this.levels.some((l) => l.label === this.selectedTradeLabel)\n        ) {\n            this.selectedTradeLabel = null;\n        }\n\n        this.recomputeRenderStyle();\n        this.renderTradeLayer();\n        return this;\n    }\n\n    /**\n     * Remove a single level by its label (derived from `labelKey` at `setLevels` time).\n     * No-op if no level with that label exists.\n     */\n    removeLevelByLabel(label: string): this {\n        this.levels = this.levels.filter((l) => l.label !== label);\n        this.renderTradeLayer();\n        return this;\n    }\n\n    /**\n     * Show a draft pending order preview line on the chart.\n     * Typically called from an external order panel when the user selects a limit/stop order type.\n     * Clears any existing draft first. The draft line is draggable; price changes emit `tradeLevelDrag`.\n     * When confirmed from the chart, `onOrderSubmit` is called and `tradeLevelConfirmed` is emitted.\n     */\n    showDraftOrder(price: number, side: 'buy' | 'sell', orderType: 'limit' | 'stop'): this {\n        // If a draft for the same side + orderType already exists, don't recreate it.\n        // Use updateDraftOrderPrice() to change the entry price, clearDraftOrder() to start fresh.\n        if (this.draftOrderLabel) {\n            const existing = this.levels.find((l) => l.label === this.draftOrderLabel) as\n                | PendingOrderLevel\n                | undefined;\n            if (existing?.side === side && existing?.orderType === orderType) {\n                return this;\n            }\n        }\n        this.clearDraftOrder();\n        this.createDraftOrder(side, price, orderType);\n        return this;\n    }\n\n    /**\n     * Show a draft market order preview on the chart at the given price.\n     * Unlike limit/stop drafts, the main line is informational (not draggable),\n     * no qty overlay is shown, and no confirm/cancel buttons appear.\n     * SL/TP brackets can still be attached via updateDraftOrderBracket.\n     */\n    showMarketDraft(price: number, side: 'buy' | 'sell'): this {\n        this.clearDraftOrder();\n        const label = `__draft_${Date.now()}`;\n        const draftLevel: PendingOrderLevel = {\n            type: 'pending',\n            label,\n            side,\n            price,\n            orderType: 'market',\n            data: { _isDraft: true },\n        };\n        this.levels = [...this.levels, draftLevel];\n        this.draftOrderLabel = label;\n        this.renderTradeLayer();\n        this.emitter.emit('draftInitiated', {\n            side,\n            price,\n            orderType: 'market',\n            isFullscreen: this.isFullscreen,\n        });\n        return this;\n    }\n\n    /**\n     * Remove the current draft order preview line and emit `draftCancelled`.\n     * Call when the order panel closes or the user switches to market order type.\n     * To cancel whatever is currently being edited or drafted (draft or existing level),\n     * use `cancelCurrentEdit()` instead.\n     */\n    clearDraftOrder(): this {\n        this.removeDraftOrder();\n        return this;\n    }\n\n    /**\n     * Update the stop-loss or take-profit bracket price on any existing level by label.\n     * Pass `null` to remove the bracket. No-op if no level with that label exists.\n     * Use this when an external panel changes SL/TP for an open position or pending order.\n     */\n    updateLevelBracket(label: string, type: 'sl' | 'tp', price: number | null): this {\n        const field = type === 'sl' ? 'stopLoss' : 'takeProfit';\n        const target = this.levels.find((l) => l.label === label) as\n            | PositionLevel\n            | PendingOrderLevel\n            | undefined;\n        if (!target) return this;\n\n        const serverBracketPrice =\n            type === 'sl' ? target.stopLossPrice : target.takeProfitPrice;\n        const existingChanges = this.pendingLevelDrags.get(label) ?? [];\n        const priorEntry = existingChanges.find((c) => c.field === field);\n        const filtered = existingChanges.filter((c) => c.field !== field);\n\n        this.levels = this.levels.map((l) => {\n            if (l.label !== label) return l;\n            const level = l as PositionLevel | PendingOrderLevel;\n            return type === 'sl'\n                ? { ...level, stopLossPrice: price ?? undefined }\n                : { ...level, takeProfitPrice: price ?? undefined };\n        });\n\n        if (price === null) {\n            // Server has the bracket → stage isRemoval so the render overlay\n            // hides it across setLevels refreshes; setLevels auto-release clears\n            // this once the server confirms the removal.\n            if (serverBracketPrice !== undefined) {\n                const oldPrice = priorEntry?.oldPrice ?? serverBracketPrice;\n                filtered.push({\n                    field,\n                    newPrice: serverBracketPrice,\n                    oldPrice,\n                    isRemoval: true,\n                });\n            }\n            // Otherwise (server has no bracket — covers priorEntry?.isNew too):\n            // dropping the prior entry via `filtered` is enough; nothing to stage.\n            if (filtered.length === 0) this.pendingLevelDrags.delete(label);\n            else this.pendingLevelDrags.set(label, filtered);\n        } else {\n            const isNew = priorEntry?.isNew ?? serverBracketPrice === undefined;\n            const oldPrice =\n                priorEntry && !priorEntry.isRemoval\n                    ? priorEntry.oldPrice\n                    : (serverBracketPrice ?? price);\n            filtered.push({ field, newPrice: price, oldPrice, isNew });\n            this.pendingLevelDrags.set(label, filtered);\n        }\n\n        this.renderTradeLayer();\n        return this;\n    }\n\n    /**\n     * Add a SL or TP bracket to an existing level at an auto-computed default price.\n     * Use this when an external panel enables a bracket without knowing the price.\n     * The chart places the bracket at the same offset used by the canvas +SL/+TP button\n     * and emits `tradeLevelBracketActivated` with the chosen price so the panel can populate its input.\n     * No-op if the level doesn't exist or already has the requested bracket.\n     */\n    addLevelBracket(label: string, type: 'sl' | 'tp'): this {\n        const level = this.levels.find((l) => l.label === label) as\n            | PositionLevel\n            | PendingOrderLevel\n            | undefined;\n        if (!level) return this;\n\n        // Skip if bracket already exists in the level data or is already pending via a prior addBracket call\n        const dragField = type === 'sl' ? 'stopLoss' : 'takeProfit';\n        const alreadyHasInLevel =\n            type === 'sl' ? level.stopLossPrice !== undefined : level.takeProfitPrice !== undefined;\n        const alreadyHasPending =\n            this.pendingLevelDrags.get(label)?.some((c) => c.field === dragField && !c.isRemoval) ?? false;\n        if (alreadyHasInLevel || alreadyHasPending) return this;\n\n        // Compute default price using the same 30px offset the +SL/+TP button uses\n        const { priceH } = this.getChartLayout();\n        const priceRange = this._displayedPriceRange ?? this.getScaledPriceRange(this.viewport);\n        const entryY = this.scaleManager.yToPixel(level.price, priceRange, priceH);\n        const side = level.side ?? 'buy';\n        const isBelowEntry =\n            (side === 'buy' && type === 'sl') || (side === 'sell' && type === 'tp');\n        const bracketY = entryY + (isBelowEntry ? 30 : -30);\n        const defaultPrice = this.scaleManager.pixelToPrice(bracketY, priceRange, priceH);\n\n        this.updateLevelBracket(label, type, defaultPrice);\n\n        // Guard the newly-placed bracket against concurrent setLevels calls (e.g. the mobile\n        // PnL-refresh loop that runs on every price tick and replaces all position levels from\n        // server state). Without this, the bracket is wiped before the UI can display it.\n        // The entry is auto-released by setLevels once the server confirms the same price, or\n        // cleared immediately if removeBracket is called.\n        const existingDrags = this.pendingLevelDrags.get(label) ?? [];\n        const filteredDrags = existingDrags.filter((c) => c.field !== dragField);\n        filteredDrags.push({ field: dragField, newPrice: defaultPrice, oldPrice: defaultPrice, isNew: true });\n        this.pendingLevelDrags.set(label, filteredDrags);\n\n        this.emitter.emit('tradeLevelBracketActivated', {\n            label,\n            bracketType: type,\n            price: defaultPrice,\n            isFullscreen: this.isFullscreen,\n        });\n        this.emitter.emit('tradeLevelDrag', {\n            label,\n            newPrice: defaultPrice,\n            data: level.data,\n            bracketType: type === 'sl' ? 'stopLoss' : 'takeProfit',\n            isFullscreen: this.isFullscreen,\n        });\n        return this;\n    }\n\n    /**\n     * Unified auto-price bracket placement for mobile UIs.\n     * - If `label` is provided, operates on the matching existing level (delegates to addLevelBracket).\n     * - If `label` is omitted, operates on the active draft order (no OrderID needed).\n     * In both cases the chart computes a sensible default price (30px offset) and emits\n     * `tradeLevelBracketActivated` with the result so the native form can populate its input.\n     * No-op if the target doesn't exist or already has the requested bracket type.\n     */\n    addBracket(type: 'sl' | 'tp', label?: string): this {\n        if (label) return this.addLevelBracket(label, type);\n\n        if (!this.draftOrderLabel) return this;\n        const draftLabel = this.draftOrderLabel;\n        const level = this.levels.find((l) => l.label === draftLabel) as\n            | PendingOrderLevel\n            | undefined;\n        if (!level) return this;\n\n        const alreadyHas =\n            type === 'sl' ? level.stopLossPrice !== undefined : level.takeProfitPrice !== undefined;\n        if (alreadyHas) return this;\n\n        const { priceH } = this.getChartLayout();\n        const priceRange = this._displayedPriceRange ?? this.getScaledPriceRange(this.viewport);\n        const entryY = this.scaleManager.yToPixel(level.price, priceRange, priceH);\n        const side = level.side ?? 'buy';\n        const isBelowEntry =\n            (side === 'buy' && type === 'sl') || (side === 'sell' && type === 'tp');\n        const bracketY = entryY + (isBelowEntry ? 30 : -30);\n        const defaultPrice = this.scaleManager.pixelToPrice(bracketY, priceRange, priceH);\n\n        this.updateDraftOrderBracket(type, defaultPrice);\n        this.emitter.emit('tradeLevelBracketActivated', {\n            label: '', // empty string signals draft — no external OrderID/TradeID yet\n            bracketType: type,\n            price: defaultPrice,\n            isFullscreen: this.isFullscreen,\n        });\n        this.emitter.emit('tradeLevelDrag', {\n            label: draftLabel,\n            newPrice: defaultPrice,\n            data: level.data,\n            bracketType: type === 'sl' ? 'stopLoss' : 'takeProfit',\n            isFullscreen: this.isFullscreen,\n        });\n        return this;\n    }\n\n    /**\n     * Unified bracket removal for mobile UIs.\n     * - If `label` is provided, removes the bracket from the matching existing level (calls updateLevelBracket with null price).\n     * - If `label` is omitted, removes the bracket from the active draft order.\n     * No-op if the target doesn't exist or doesn't have the bracket type.\n     */\n    removeBracket(type: 'sl' | 'tp', label?: string): this {\n        if (label) {\n            const field = (type === 'sl' ? 'stopLoss' : 'takeProfit') as 'stopLoss' | 'takeProfit';\n            const level = this.levels.find((l) => l.label === label) as\n                | PositionLevel\n                | PendingOrderLevel\n                | undefined;\n            if (!level) return this;\n            // Determine the effective bracket price (prefer an existing pending drag over level data)\n            const existingChange = this.pendingLevelDrags.get(label)?.find((c) => c.field === field);\n            const effectivePrice =\n                existingChange && !existingChange.isRemoval\n                    ? existingChange.newPrice\n                    : type === 'sl'\n                      ? level.stopLossPrice\n                      : level.takeProfitPrice;\n            if (effectivePrice === undefined) return this; // bracket doesn't exist, nothing to remove\n            // Stage as pending removal — preserves this.levels (server state) so if the user\n            // closes the bottom sheet without submitting, re-opening will still show the bracket.\n            // The guard is auto-released by setLevels once the server confirms the removal.\n            const existingDrags = this.pendingLevelDrags.get(label) ?? [];\n            const filteredDrags = existingDrags.filter((c) => c.field !== field);\n            filteredDrags.push({ field, newPrice: effectivePrice, oldPrice: effectivePrice, isRemoval: true });\n            this.pendingLevelDrags.set(label, filteredDrags);\n            this.renderTradeLayer();\n            return this;\n        }\n        if (type === 'sl') {\n            this.draftBracketPnl = { ...this.draftBracketPnl, sl: undefined };\n        } else {\n            this.draftBracketPnl = { ...this.draftBracketPnl, tp: undefined };\n        }\n        return this.updateDraftOrderBracket(type, null);\n    }\n\n    /**\n     * Move an existing level's entry price line to a new price and re-render.\n     * Used when an external panel updates the entry price for an open position or pending order.\n     * No-op if no level with that label exists.\n     */\n    updateLevelMainPrice(label: string, price: number): this {\n        const level = this.levels.find((l) => l.label === label);\n        if (!level) return this;\n\n        const existingChanges = this.pendingLevelDrags.get(label) ?? [];\n        const priorMain = existingChanges.find((c) => c.field === 'main');\n        // Preserve oldPrice from the first edit so repeated keystrokes don't\n        // overwrite it with the previously-typed value.\n        const oldPrice = priorMain ? priorMain.oldPrice : level.price;\n        const filtered = existingChanges.filter((c) => c.field !== 'main');\n        filtered.push({ field: 'main', newPrice: price, oldPrice });\n        this.pendingLevelDrags.set(label, filtered);\n\n        level.price = price;\n        this.renderTradeLayer();\n        return this;\n    }\n\n    /**\n     * Set or clear the estimated PNL text shown on the SL or TP bracket line.\n     * Applies to the currently active bracket host — a draft order while drafting,\n     * or the selected level while modifying an existing pending order or position.\n     * Pass `null` to clear the text.\n     * Use this to display the consumer-calculated estimated profit/loss next to the bracket.\n     */\n    setDraftBracketPnl(type: 'sl' | 'tp', pnlText: string | null): this {\n        if (type === 'sl') {\n            this.draftBracketPnl = { ...this.draftBracketPnl, sl: pnlText ?? undefined };\n        } else {\n            this.draftBracketPnl = { ...this.draftBracketPnl, tp: pnlText ?? undefined };\n        }\n        this.renderTradeLayer();\n        return this;\n    }\n\n    /**\n     * Update the stop-loss or take-profit price on the current draft order.\n     * Pass `null` to remove the bracket. No-op if no draft order is active.\n     */\n    updateDraftOrderBracket(type: 'sl' | 'tp', price: number | null): this {\n        if (!this.draftOrderLabel) return this;\n        this.levels = this.levels.map((l) => {\n            if (l.label !== this.draftOrderLabel) return l;\n            const level = l as PendingOrderLevel;\n            return type === 'sl'\n                ? { ...level, stopLossPrice: price ?? undefined }\n                : { ...level, takeProfitPrice: price ?? undefined };\n        });\n        this.scheduleRender();\n        return this;\n    }\n\n    /**\n     * Update the entry price of the active draft order in-place without recreating it.\n     * Unlike `showDraftOrder`, this does NOT call `clearDraftOrder` + `createDraftOrder`,\n     * so the qty overlay is repositioned but never re-focused.\n     * Returns `true` if a draft existed and was updated, `false` if no draft is active.\n     */\n    updateDraftOrderPrice(price: number): boolean {\n        if (!this.draftOrderLabel) return false;\n\n        this.levels = this.levels.map((l) => {\n            if (l.label !== this.draftOrderLabel) return l;\n            return { ...(l as PendingOrderLevel), price };\n        });\n\n        const changes = this.pendingLevelDrags.get(this.draftOrderLabel);\n        if (changes) {\n            const main = changes.find((c) => c.field === 'main');\n            if (main) main.newPrice = price;\n        }\n\n        this.renderTradeLayer();\n        return true;\n    }\n\n    /**\n     * Cancel the pending edit state of a level without firing `tradeLevelEdit`.\n     * Use when the external order panel has already handled the confirmation,\n     * preventing the chart from sending a duplicate server request.\n     */\n    cancelLevelEdit(label: string): this {\n        this.undoIsNewBracketMutations(label);\n        this.pendingLevelDrags.delete(label);\n        if (this.pendingQtyChanges.has(label)) {\n            this.pendingQtyChanges.delete(label);\n            const idx = this.levels.findIndex((l) => l.label === label);\n            if (idx !== -1 && this.originalQtyByLabel.has(label)) {\n                const orig = this.originalQtyByLabel.get(label);\n                const lvl = this.levels[idx] as PendingOrderLevel | PositionLevel;\n                this.levels = [\n                    ...this.levels.slice(0, idx),\n                    { ...lvl, lots: orig } as AnyLevel,\n                    ...this.levels.slice(idx + 1),\n                ];\n            }\n            this.originalQtyByLabel.delete(label);\n        }\n        if (label === (this.draftOrderLabel ?? this.selectedTradeLabel)) {\n            this.draftBracketPnl = {};\n        }\n        if (this.selectedTradeLabel === label) this.selectedTradeLabel = null;\n        this.renderTradeLayer();\n        return this;\n    }\n\n    /**\n     * Cancel whatever is currently being edited or drafted on the chart.\n     * Handles all three cases without the caller needing to track the active label:\n     *   - active limit/stop draft (`draftOrderLabel === selectedTradeLabel`) — emits `draftCancelled`\n     *   - active market draft (`draftOrderLabel` set, no `selectedTradeLabel`) — emits `draftCancelled`\n     *   - in-progress level edit (`selectedTradeLabel` set with pending changes) — reverts staged changes\n     * No-op when nothing is being edited.\n     */\n    cancelCurrentEdit(): this {\n        if (this.draftOrderLabel) {\n            this.clearDraftOrder();\n        } else if (this.selectedTradeLabel) {\n            this.revertPendingChanges(this.selectedTradeLabel);\n        }\n        return this;\n    }\n\n    /**\n     * Programmatically select (activate) a trade level by its label.\n     * Pass `null` to deselect the currently active level.\n     * Useful when an external panel (e.g. positions table) opens an edit form\n     * and the chart should highlight the corresponding level.\n     */\n    selectLevel(label: string | null): this {\n        // Clear any prior bracket PnL text when switching away from the previous\n        // host (deselect, or selecting a different level). Leave it alone while\n        // a draft is active — drafts own their own PnL lifecycle via removeDraftOrder.\n        if (!this.draftOrderLabel && label !== this.selectedTradeLabel) {\n            this.draftBracketPnl = {};\n        }\n        this.selectedTradeLabel = label;\n        if (label !== null) {\n            this.crosshair = null;\n            // Auto-expand any cluster containing the selected label\n            const cluster = this.lastClusters.find((c) =>\n                c.members.some((m) => m.level.label === label)\n            );\n            if (cluster) this.expandedClusters.add(cluster.id);\n        }\n        this.renderTradeLayer();\n        return this;\n    }\n\n    /** Enable or disable trade-level fan-out clustering at runtime. */\n    setLevelClusteringEnabled(enabled: boolean): this {\n        this.levelClusteringEnabled = enabled;\n        this.expandedClusters.clear();\n        this.renderTradeLayer();\n        return this;\n    }\n\n    /** Update the cluster proximity threshold (in pixels) at runtime. Only effective when levelClusteringEnabled is true. */\n    setClusterThresholdDistance(px: number): this {\n        this.clusterThresholdDistance = px;\n        this.expandedClusters.clear();\n        this.renderTradeLayer();\n        return this;\n    }\n\n    /**\n     * Scale the Confirm/Cancel/Edit/Close buttons on trade-level overlays.\n     * Both visuals and hit-rects grow together. Clamped to `[1, 3]`.\n     */\n    setTradeLevelButtonScale(scale: number): this {\n        this.tradeLevelButtonScale = Math.min(Math.max(scale, 1), 3);\n        this.renderTradeLayer();\n        return this;\n    }\n\n    destroy(): void {\n        this._isDestroyed = true;\n        this.panHandler.destroy();\n        this.zoomHandler.destroy();\n        this.resizeObserver.disconnect();\n        this.disposeVvListener();\n        this.indicatorOverlay?.destroy();\n        for (const overlay of this.subPaneOverlays.values()) overlay.destroy();\n        this.subPaneOverlays.clear();\n        this.indicatorSettingsDialog?.destroy();\n        this.chartSettingsDialog?.destroy();\n        this.isinPickerModal?.destroy();\n        this.tradePopover?.destroy();\n        this.drawingStylePopover?.destroy();\n        this._draftQtyFlyout?.destroy();\n        this.leftBar?.destroy();\n        this.drawCanvas.removeEventListener('mousemove', this.onMouseMove);\n        this.drawCanvas.removeEventListener('mouseleave', this.onMouseLeave);\n        this.drawCanvas.removeEventListener('mousedown', this.onCanvasClick);\n        this.drawCanvas.removeEventListener('dblclick', this.onDoubleClick);\n        window.removeEventListener('mouseup', this.onMouseUp);\n        this.drawCanvas.removeEventListener('touchstart', this.onDrawingTouchStart);\n        this.drawCanvas.removeEventListener('touchmove', this.onDrawingTouchMove);\n        this.drawCanvas.removeEventListener('touchend', this.onDrawingTouchEnd);\n        document.removeEventListener('keydown', this.onKeyDown);\n        this.streamAdapter?.disconnect();\n        if (this.rafId !== null) cancelAnimationFrame(this.rafId);\n        if (this.scrollAnimId !== null) cancelAnimationFrame(this.scrollAnimId);\n        this.stopCountdownLoop();\n        this.resetViewBtn?.remove();\n        this.textInputEl?.remove();\n        this._mobileDrawingFlyout?.remove();\n        this.wrapper.remove();\n    }\n\n    // ── Mobile drawing flyout ─────────────────────────────────────────────────\n\n    private createMobileDrawingFlyout(): HTMLDivElement {\n        const flyout = document.createElement('div');\n        Object.assign(flyout.style, {\n            position: 'fixed',\n            display: 'none',\n            alignItems: 'center',\n            gap: '2px',\n            zIndex: '10000',\n            background: this.theme.background,\n            border: `1px solid ${this.theme.axisBorder}`,\n            borderRadius: '8px',\n            padding: '4px',\n            boxShadow: '0 4px 16px rgba(0,0,0,0.45)',\n            pointerEvents: 'auto',\n        });\n\n        const mkBtn = (icon: string, label: string, danger: boolean): HTMLButtonElement => {\n            const btn = document.createElement('button');\n            btn.title = label;\n            btn.innerHTML = icon;\n            Object.assign(btn.style, {\n                display: 'flex',\n                alignItems: 'center',\n                justifyContent: 'center',\n                width: '34px',\n                height: '34px',\n                padding: '0',\n                border: 'none',\n                borderRadius: '6px',\n                background: 'transparent',\n                color: danger ? this.theme.candle.down : this.theme.axisText,\n                cursor: 'pointer',\n                flexShrink: '0',\n            });\n            btn.addEventListener('pointerenter', () => {\n                btn.style.background = danger\n                    ? `${this.theme.candle.down}22`\n                    : this.theme.axisBorder;\n            });\n            btn.addEventListener('pointerleave', () => {\n                btn.style.background = 'transparent';\n            });\n            return btn;\n        };\n\n        const deleteBtn = mkBtn(ICON_TRASH, 'Delete drawing', true);\n        deleteBtn.addEventListener('pointerdown', (e) => {\n            e.stopPropagation();\n            this.deleteSelectedDrawing();\n            this.hideMobileDrawingFlyout();\n        });\n\n        const closeBtn = mkBtn(ICON_CLOSE, 'Deselect', false);\n        closeBtn.addEventListener('pointerdown', (e) => {\n            e.stopPropagation();\n            this.drawingManager.selectDrawing(null);\n            this.hideMobileDrawingFlyout();\n            this.scheduleRender();\n        });\n\n        flyout.appendChild(deleteBtn);\n        flyout.appendChild(closeBtn);\n        this.wrapper.appendChild(flyout);\n        return flyout;\n    }\n\n    private showMobileDrawingFlyout(clientX: number, clientY: number): void {\n        if (!isMobileDevice()) return;\n        if (!this._mobileDrawingFlyout) {\n            this._mobileDrawingFlyout = this.createMobileDrawingFlyout();\n        }\n        const flyout = this._mobileDrawingFlyout;\n        const wasVisible = flyout.style.display !== 'none' && flyout.style.display !== '';\n        flyout.style.display = 'flex';\n\n        // Position above the touch point; clamp to viewport bounds\n        requestAnimationFrame(() => {\n            const fw = flyout.offsetWidth || 78;\n            const fh = flyout.offsetHeight || 42;\n            const vw = window.innerWidth;\n            const vh = window.innerHeight;\n            const gap = 12;\n            const left = Math.min(Math.max(clientX - fw / 2, 8), vw - fw - 8);\n            const top = Math.min(Math.max(clientY - fh - gap, 8), vh - fh - 8);\n            flyout.style.left = `${left}px`;\n            flyout.style.top = `${top}px`;\n        });\n\n        if (!wasVisible) this.emitUiState();\n    }\n\n    private hideMobileDrawingFlyout(): void {\n        if (this._mobileDrawingFlyout) {\n            const wasVisible = this._mobileDrawingFlyout.style.display !== 'none'\n                && this._mobileDrawingFlyout.style.display !== '';\n            this._mobileDrawingFlyout.style.display = 'none';\n            if (wasVisible) this.emitUiState();\n        }\n    }\n\n    private applyMobileDrawingFlyoutTheme(): void {\n        if (!this._mobileDrawingFlyout) return;\n        const f = this._mobileDrawingFlyout;\n        f.style.background = this.theme.background;\n        f.style.border = `1px solid ${this.theme.axisBorder}`;\n        const btns = Array.from(f.querySelectorAll<HTMLButtonElement>('button'));\n        const [deleteBtn, closeBtn] = btns;\n        if (deleteBtn) deleteBtn.style.color = this.theme.candle.down;\n        if (closeBtn) closeBtn.style.color = this.theme.axisText;\n    }\n\n    // ── Rendering ─────────────────────────────────────────────────────────────\n\n    private scheduleRender(): void {\n        if (this._isDestroyed) return;\n        if (this.rafId !== null) return;\n        this.rafId = requestAnimationFrame(() => {\n            this.rafId = null;\n            this.render();\n            this.renderTradeLayer();\n        });\n    }\n\n    private startCountdownLoop(): void {\n        if (this.countdownRafId !== null) return;\n        let lastTick = 0;\n        const loop = (now: number) => {\n            if (!this.countdownActive) {\n                this.countdownRafId = null;\n                return;\n            }\n            if (now - lastTick >= 1000) {\n                lastTick = now;\n                this.scheduleRender();\n            }\n            this.countdownRafId = requestAnimationFrame(loop);\n        };\n        this.countdownRafId = requestAnimationFrame(loop);\n    }\n\n    private stopCountdownLoop(): void {\n        this.countdownActive = false;\n        if (this.countdownRafId !== null) {\n            cancelAnimationFrame(this.countdownRafId);\n            this.countdownRafId = null;\n        }\n    }\n\n    private updateCountdownState(): void {\n        const INTRADAY: Timeframe[] = ['1m', '5m', '15m', '30m', '1h', '2h', '4h', '8h'];\n        const allowed =\n            this.candleCountdownTimeframes === 'all'\n                ? true\n                : (this.candleCountdownTimeframes ?? INTRADAY).includes(\n                      this.timeframe as Timeframe\n                  );\n        const should =\n            (this.showCandleCountdown || this.showPriceAxisCountdown) &&\n            allowed &&\n            this.dataStore.length > 0;\n        if (should && !this.countdownActive) {\n            this.countdownActive = true;\n            this.startCountdownLoop();\n        } else if (!should && this.countdownActive) {\n            this.stopCountdownLoop();\n        }\n    }\n\n    private openChartSettings(): void {\n        if (!this.chartSettingsDialog) {\n            this.chartSettingsDialog = new ChartSettingsDialog(\n                this.theme,\n                {\n                    tradeDisplayFilter: this.tradeDisplayFilter,\n                    positionRenderStyle: this.positionRenderStyle,\n                    theme: this.themeName,\n                    showTradeLevelsAlways: this.showTradeLevelsAlways,\n                    showPriceAxisCountdown: this.showPriceAxisCountdown,\n                },\n                this.labels.dialogs,\n                !!this._onOrderSubmit && this.tfcActive,\n                this.enableThemeToggle,\n                () => this.emitUiState(),\n            );\n            this.getFloatingRoot().appendChild(this.chartSettingsDialog.el);\n        }\n        this.chartSettingsDialog.show(\n            {\n                tradeDisplayFilter: this.tradeDisplayFilter,\n                positionRenderStyle: this.positionRenderStyle,\n                theme: this.themeName,\n                showTradeLevelsAlways: this.showTradeLevelsAlways,\n                showPriceAxisCountdown: this.showPriceAxisCountdown,\n                canvasColors: { ...this.settingsCanvasColors },\n            },\n            (settings: ChartSettings) => {\n                this.tradeDisplayFilter = settings.tradeDisplayFilter;\n                this.positionRenderStyleOverride = settings.positionRenderStyle;\n                localStorage.setItem(this.RENDER_STYLE_LS_KEY, settings.positionRenderStyle);\n                this.positionRenderStyle = settings.positionRenderStyle;\n                if (settings.canvasColors) {\n                    this.settingsCanvasColors = settings.canvasColors;\n                }\n                if (this.showTradeLevelsAlways !== settings.showTradeLevelsAlways) {\n                    this.showTradeLevelsAlways = settings.showTradeLevelsAlways;\n                    try {\n                        localStorage.setItem(\n                            this.SHOW_SLTP_ALWAYS_LS_KEY,\n                            String(settings.showTradeLevelsAlways),\n                        );\n                    } catch { /* localStorage unavailable */ }\n                }\n                if (this.showPriceAxisCountdown !== settings.showPriceAxisCountdown) {\n                    this.showPriceAxisCountdown = settings.showPriceAxisCountdown;\n                    try {\n                        localStorage.setItem(\n                            this.PRICE_AXIS_COUNTDOWN_LS_KEY,\n                            String(settings.showPriceAxisCountdown),\n                        );\n                    } catch { /* localStorage unavailable */ }\n                    this.updateCountdownState();\n                    this.scheduleRender();\n                }\n                this.setTheme(settings.theme);\n                this.renderTradeLayer();\n                this.emitStateChange();\n            },\n            () => {\n                this.resetChartSettings();\n            }\n        );\n    }\n\n    /** Returns the element floating UI should be parented to — the fullscreen element when active, otherwise document.body. */\n    private getFloatingRoot(): HTMLElement {\n        return (document.fullscreenElement as HTMLElement | null) ?? document.body;\n    }\n\n    /**\n     * Re-parents all floating elements (flyouts, modals) to the correct root.\n     * Called on fullscreenchange so they remain visible inside the fullscreen context.\n     */\n    private reparentFloatingElements(): void {\n        const root = this.getFloatingRoot();\n        this.topBar?.reparentFlyout(root);\n        this.leftBar?.reparentFlyout(root);\n        const modals: (HTMLElement | undefined)[] = [\n            this.isinPickerModal?.el,\n            this.indicatorSettingsDialog?.el,\n            this.chartSettingsDialog?.el,\n            this._draftQtyFlyout?.el,\n        ];\n        for (const el of modals) {\n            if (el && el.parentElement !== root) root.appendChild(el);\n        }\n    }\n\n    private toggleDrawingTools(): void {\n        this.leftBarVisible = !this.leftBarVisible;\n        this.leftBar?.setVisible(this.leftBarVisible);\n        this.topBar?.setDrawingsBtnActive(this.leftBarVisible);\n    }\n\n    private _applyCssFullscreen(enter: boolean): void {\n        this._isCssFullscreen = enter;\n        if (enter) {\n            Object.assign(this.wrapper.style, {\n                position: 'fixed',\n                inset: '0',\n                width: '100vw',\n                height: '100vh',\n                zIndex: '9999',\n            });\n        } else {\n            Object.assign(this.wrapper.style, {\n                position: '',\n                inset: '',\n                width: '',\n                height: '',\n                zIndex: '',\n            });\n        }\n        this.topBar?.setFullscreen(enter);\n        this.reparentFloatingElements();\n        requestAnimationFrame(() => this.onResize());\n    }\n\n    private toggleFullscreen(): void {\n        const isNativeFs = !!document.fullscreenElement;\n\n        if (!isNativeFs && !this._isCssFullscreen) {\n            // Enter fullscreen — try native first, fall back to CSS\n            if (this.wrapper.requestFullscreen) {\n                this.wrapper\n                    .requestFullscreen()\n                    .then(() => {\n                        // Update icon immediately — fullscreenchange may not fire in WebViews\n                        this.topBar?.setFullscreen(true);\n                    })\n                    .catch(() => {\n                        this._applyCssFullscreen(true);\n                    });\n            } else {\n                // iOS Safari and environments with no Fullscreen API\n                this._applyCssFullscreen(true);\n            }\n        } else if (isNativeFs) {\n            document.exitFullscreen().catch(() => {});\n            // fullscreenchange listener handles icon + CSS state reset\n        } else {\n            // Exit CSS fullscreen\n            this._applyCssFullscreen(false);\n        }\n    }\n\n    private recomputeRenderStyle(): void {\n        if (this.positionRenderStyleOverride !== null) {\n            this.positionRenderStyle = this.positionRenderStyleOverride;\n            return;\n        }\n        const activeCount = this.levels.filter(\n            (l) => l.type === 'position' || l.type === 'pending'\n        ).length;\n        this.positionRenderStyle =\n            activeCount > this.tradesThresholdForHorizontalLine ? 'dot' : 'line';\n    }\n\n    private renderTradeLayer(): void {\n        if (this._isDestroyed) return;\n        const dpr = window.devicePixelRatio || 1;\n        const { tradeCtx: ctx, tradeCanvas: canvas, theme, viewport } = this;\n\n        ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n        if (!this.tfcActive || this.levels.length === 0 || this.dataStore.length === 0) {\n            this.tradeLevelHitAreas = [];\n            this.tradeLevelEditAreas = [];\n            this.tradeHoverAreas = [];\n            this.tradeAddBracketAreas = [];\n            this.offViewportHitAreas = [];\n            return;\n        }\n\n        const { chartW, priceH } = this.getChartLayout();\n        const priceRange = this._displayedPriceRange ?? this.getScaledPriceRange(viewport);\n\n        // Separate bracket orders (ToClose set) from main levels, then inject\n        // stopLossPrice / takeProfitPrice onto their parent levels.\n        const bracketOrders = this.levels.filter(\n            (l) => l.type === 'pending' && (l as PendingOrderLevel).ToClose != null\n        ) as PendingOrderLevel[];\n\n        const processedLevels = this.levels\n            .filter((l) => !(l.type === 'pending' && (l as PendingOrderLevel).ToClose != null))\n            .map((l) => {\n                const draftChanges = this.pendingLevelDrags.get(l.label) ?? [];\n                const slChange = draftChanges.find((c) => c.field === 'stopLoss');\n                const tpChange = draftChanges.find((c) => c.field === 'takeProfit');\n                const slDraft = slChange && !slChange.isRemoval ? slChange.newPrice : undefined;\n                const tpDraft = tpChange && !tpChange.isRemoval ? tpChange.newPrice : undefined;\n                const slIsRemoval = slChange?.isRemoval ?? false;\n                const tpIsRemoval = tpChange?.isRemoval ?? false;\n                const mainDraft = draftChanges.find((c) => c.field === 'main')?.newPrice;\n\n                const linked = bracketOrders.filter((b) => b.ToClose === l.label);\n                if (\n                    linked.length === 0 &&\n                    slDraft === undefined &&\n                    tpDraft === undefined &&\n                    mainDraft === undefined &&\n                    !slIsRemoval &&\n                    !tpIsRemoval\n                )\n                    return l;\n\n                type CloneWithBracketLabels = (PositionLevel | PendingOrderLevel) & {\n                    _slOrderLabel?: string;\n                    _tpOrderLabel?: string;\n                };\n                const clone = { ...l } as CloneWithBracketLabels;\n\n                // Apply pending draft prices / removals for all fields\n                if (mainDraft !== undefined) clone.price = mainDraft;\n                if (slDraft !== undefined) (clone as PositionLevel).stopLossPrice = slDraft;\n                else if (slIsRemoval) (clone as PositionLevel).stopLossPrice = undefined;\n                if (tpDraft !== undefined) (clone as PositionLevel).takeProfitPrice = tpDraft;\n                else if (tpIsRemoval) (clone as PositionLevel).takeProfitPrice = undefined;\n\n                // Inject SL/TP from ToClose bracket orders.\n                // Priority: pending drag > removal flag > panel override > bracket order price\n                if (linked.length > 0) {\n                    const parentSide = (l as PositionLevel | PendingOrderLevel).side ?? 'buy';\n                    for (const b of linked) {\n                        const isSL = parentSide === 'buy' ? b.price < l.price : b.price > l.price;\n                        if (isSL) {\n                            clone.stopLossPrice = slIsRemoval ? undefined : (slDraft ?? clone.stopLossPrice ?? b.price);\n                            clone._slOrderLabel = b.label;\n                        } else {\n                            clone.takeProfitPrice = tpIsRemoval ? undefined : (tpDraft ?? clone.takeProfitPrice ?? b.price);\n                            clone._tpOrderLabel = b.label;\n                        }\n                    }\n                }\n\n                return clone;\n            });\n\n        ctx.save();\n        ctx.scale(dpr, dpr);\n        ctx.save();\n        ctx.beginPath();\n        ctx.rect(0, 0, chartW, priceH);\n        ctx.clip();\n\n        // When a level is selected, show only that level (hide all others)\n        // Otherwise apply the display filter setting\n        const isEntryOrder = (l: AnyLevel) =>\n            l.type === 'position' && !!(l as PositionLevel).entryPriceEditable;\n\n        const filteredLevels =\n            this.selectedTradeLabel !== null\n                ? processedLevels.filter((l) => l.label === this.selectedTradeLabel)\n                : this.tradeDisplayFilter === 'none'\n                  ? []\n                  : this.tradeDisplayFilter === 'positions'\n                    ? // Exclude entry-order positions (ES/EL) — they behave as pending orders\n                      processedLevels.filter((l) => l.type === 'position' && !isEntryOrder(l))\n                    : this.tradeDisplayFilter === 'orders'\n                      ? // Include true pending orders AND entry-order positions (ES/EL)\n                        processedLevels.filter((l) => l.type === 'pending' || isEntryOrder(l))\n                      : processedLevels;\n\n        const clusterThreshold = this.levelClusteringEnabled\n            ? this.clusterThresholdDistance\n            : 0;\n\n        const result = renderTradeLevels(\n            ctx,\n            filteredLevels,\n            this.scaleManager,\n            priceRange,\n            theme,\n            chartW,\n            priceH,\n            this.dataStore.getPricePrecision(),\n            this.hoveredTradeLabel,\n            this.tradeDragHandler?.dragLabel ?? null,\n            this.tradeDragNewPrice,\n            this.selectedTradeLabel,\n            // Include _editOpenLabel so confirm/cancel buttons appear while the edit form is open\n            // even before any change is staged — e.g. editing a position with no SL/TP.\n            new Set([\n                ...this.pendingLevelDrags.keys(),\n                ...(this._editOpenLabel !== null ? [this._editOpenLabel] : []),\n            ]),\n            this.positionRenderStyle,\n            this.hideLevelConfirmCancel,\n            this.draftOrderLabel,\n            this.draftBracketPnl,\n            this.expandedClusters,\n            clusterThreshold,\n            this._showQuantityField,\n            this.tradeDragNewSLPrice,\n            this.tradeDragNewTPPrice,\n            this.tradeLevelButtonScale,\n            this.showTradeLevelsAlways,\n        );\n\n        ctx.restore(); // end price-pane clip\n\n        // Off-viewport level indicator pills — drawn outside the price-pane\n        // clip but still inside the dpr scale save so CSS-pixel coords work.\n        const offVpResult = renderOffViewportIndicators(\n            ctx,\n            filteredLevels,\n            priceRange,\n            theme,\n            chartW,\n            priceH,\n            this.tradeDragHandler?.dragLabel ?? null,\n            this.selectedTradeLabel,\n        );\n        this.offViewportHitAreas = offVpResult.hitAreas;\n\n        renderPositionAxisTags(\n            ctx,\n            filteredLevels,\n            this.scaleManager,\n            priceRange,\n            theme,\n            chartW,\n            priceH,\n            this.dataStore.getPricePrecision()\n        );\n\n        ctx.restore();\n\n        this.tradeLevelHitAreas = result.hitAreas;\n        this.tradeLevelEditAreas = result.editAreas;\n        this.tradeHoverAreas = result.hoverAreas;\n        this.tradeLevelDragAreas = result.dragAreas;\n        this.tradeLevelConfirmAreas = result.confirmAreas;\n        this.tradeAddBracketAreas = result.addBracketAreas;\n        this.clusterBadgeAreas = result.clusterBadgeAreas;\n        this.lastClusters = result.clusters;\n        this._draftQtyPillArea = result.draftQtyPillArea;\n\n        // Prune expanded cluster IDs that no longer exist (zoom/pan changed membership)\n        if (this.expandedClusters.size > 0) {\n            const currentIds = new Set(result.clusters.map((c) => c.id));\n            for (const id of this.expandedClusters) {\n                if (!currentIds.has(id)) this.expandedClusters.delete(id);\n            }\n        }\n    }\n\n    // ── Inline pending-change confirmation ────────────────────────────────────\n\n    /** Returns the effective entry price for a level, preferring any staged main drag. */\n    private _effectiveEntryPrice(label: string, fallback: number): number {\n        const changes = this.pendingLevelDrags.get(label);\n        return changes?.find((c) => c.field === 'main')?.newPrice ?? fallback;\n    }\n\n    /**\n     * Returns the effective bracket (SL/TP) price for a level, preferring any staged\n     * bracket drag over the level's stored bracket price. Used at entry-drag start so\n     * the follow-brackets delta is measured from whatever the user currently sees.\n     */\n    private _effectiveBracketPrice(\n        label: string,\n        bracketField: 'stopLoss' | 'takeProfit',\n        fallback: number | undefined,\n    ): number | undefined {\n        const changes = this.pendingLevelDrags.get(label);\n        const staged = changes?.find((c) => c.field === bracketField)?.newPrice;\n        return staged ?? fallback;\n    }\n\n    /**\n     * Resolves the effective SL/TP prices for a level, checking both inline fields and\n     * ToClose sibling levels (used by existing pending orders whose brackets are stored\n     * as separate PendingOrderLevel objects rather than inline stopLossPrice/takeProfitPrice).\n     * Also returns the sibling labels for proper bracketOrderLabel attribution.\n     */\n    private _resolveBracketPrices(level: AnyLevel): {\n        slPrice: number | undefined;\n        tpPrice: number | undefined;\n        slSiblingLabel: string | undefined;\n        tpSiblingLabel: string | undefined;\n    } {\n        let slPrice = (level as PositionLevel | PendingOrderLevel).stopLossPrice;\n        let tpPrice = (level as PositionLevel | PendingOrderLevel).takeProfitPrice;\n        let slSiblingLabel: string | undefined;\n        let tpSiblingLabel: string | undefined;\n        if (slPrice === undefined || tpPrice === undefined) {\n            const siblings = this.levels.filter(\n                (l) => l.type === 'pending' && (l as PendingOrderLevel).ToClose === level.label\n            ) as PendingOrderLevel[];\n            if (siblings.length > 0) {\n                const side = (level as PendingOrderLevel).side ?? 'buy';\n                for (const sib of siblings) {\n                    const isSL = side === 'buy' ? sib.price < level.price : sib.price > level.price;\n                    if (isSL && slPrice === undefined) {\n                        slPrice = sib.price;\n                        slSiblingLabel = sib.label;\n                    } else if (!isSL && tpPrice === undefined) {\n                        tpPrice = sib.price;\n                        tpSiblingLabel = sib.label;\n                    }\n                }\n            }\n        }\n        return { slPrice, tpPrice, slSiblingLabel, tpSiblingLabel };\n    }\n\n    /**\n     * Finalises a main-line drag that may have dragged SL/TP along with it (follow-brackets mode).\n     * Stores MAIN and, if the brackets were translated, synthesized SL/TP pending changes in one\n     * batch. In mobile mode (`hideLevelConfirmCancel`) the final call triggers a single atomic\n     * `applyPendingChanges` so consumers see one `tradeLevelEdit` event with all changes.\n     */\n    private _finalizeMainDragWithBrackets(\n        result: NonNullable<ReturnType<TradeDragHandler['endDrag']>>,\n        bracketOrderLabel: string | undefined,\n    ): void {\n        const level = this.levels.find((l) => l.label === result.label);\n\n        const slMoved =\n            result.derivedSLPrice !== undefined &&\n            result.slStartPrice !== undefined &&\n            result.derivedSLPrice !== result.slStartPrice;\n        const tpMoved =\n            result.derivedTPPrice !== undefined &&\n            result.tpStartPrice !== undefined &&\n            result.derivedTPPrice !== result.tpStartPrice;\n\n        // Main change is first; it's the \"last\" only when no brackets moved.\n        const mainIsLast = !slMoved && !tpMoved;\n        this.storePendingChange(\n            result,\n            result.startPrice,\n            bracketOrderLabel,\n            /* skipAutoApply */ !mainIsLast,\n        );\n\n        // If MAIN was rejected by validation (e.g. market moved so a limit is now on the\n        // wrong side), don't stage follow-through SL/TP moves. Detect by checking the pending\n        // map — storePendingChange only writes to it on success.\n        const mainAccepted = this.pendingLevelDrags\n            .get(result.label)\n            ?.some((c) => c.field === 'main' && c.newPrice === result.newPrice);\n        if (!mainAccepted) {\n            this.tradeDragNewSLPrice = null;\n            this.tradeDragNewTPPrice = null;\n            return;\n        }\n\n        if (slMoved) {\n            const slIsLast = !tpMoved;\n            const posLevel = level as PositionLevel | undefined;\n            const pendingLevel = level as PendingOrderLevel | undefined;\n            const slData =\n                (posLevel?.stopLossData ?? pendingLevel?.stopLossData) ?? result.data;\n            this.storePendingChange(\n                {\n                    label:       result.label,\n                    type:        result.type,\n                    newPrice:    result.derivedSLPrice as number,\n                    data:        slData,\n                    bracketType: 'stopLoss',\n                },\n                result.slStartPrice as number,\n                this._slSiblingOrderLabel ?? bracketOrderLabel,\n                /* skipAutoApply */ !slIsLast,\n            );\n        }\n\n        if (tpMoved) {\n            const posLevel = level as PositionLevel | undefined;\n            const pendingLevel = level as PendingOrderLevel | undefined;\n            const tpData =\n                (posLevel?.takeProfitData ?? pendingLevel?.takeProfitData) ?? result.data;\n            this.storePendingChange(\n                {\n                    label:       result.label,\n                    type:        result.type,\n                    newPrice:    result.derivedTPPrice as number,\n                    data:        tpData,\n                    bracketType: 'takeProfit',\n                },\n                result.tpStartPrice as number,\n                this._tpSiblingOrderLabel ?? bracketOrderLabel,\n                /* skipAutoApply */ false, // always last\n            );\n        }\n\n        this.tradeDragNewSLPrice = null;\n        this.tradeDragNewTPPrice = null;\n        this._slSiblingOrderLabel = null;\n        this._tpSiblingOrderLabel = null;\n    }\n\n    private storePendingChange(\n        result: {\n            label: string;\n            type: TradeLevelType;\n            newPrice: number;\n            data: unknown;\n            bracketType?: 'stopLoss' | 'takeProfit';\n        },\n        oldPrice: number,\n        bracketOrderLabel?: string,\n        // When true, skip the mobile auto-apply at the end. Used when bundling multiple\n        // accumulated changes (e.g. MAIN + SL + TP from follow-brackets entry drag) into a\n        // single atomic applyPendingChanges call on the LAST storePendingChange invocation.\n        skipAutoApply: boolean = false,\n    ): void {\n        // Bracket SL/TP validation\n        if (result.bracketType) {\n            const level = this.levels.find((l) => l.label === result.label) as\n                | {\n                      side?: 'buy' | 'sell';\n                      price: number;\n                      entryPriceEditable?: boolean;\n                      data?: unknown;\n                  }\n                | undefined;\n            const parentSide = level?.side ?? 'buy';\n            const parentPrice = this._effectiveEntryPrice(result.label, level?.price ?? oldPrice);\n            const isEntryOrder = level?.entryPriceEditable === true;\n            const isDraft = (level?.data as { _isDraft?: boolean } | undefined)?._isDraft === true;\n            // Mobile: pending orders validate SL/TP against the order's triggered price only,\n            // not the current market price (matches web portal behaviour).\n            const isMobilePendingOrder =\n                this.hideLevelConfirmCancel && result.type === 'pending' && !isDraft;\n            const all = this.dataStore.all;\n            const marketPrice =\n                isEntryOrder || isDraft || isMobilePendingOrder\n                    ? 0\n                    : (all[all.length - 1]?.close ?? 0);\n            if (\n                !TradeDragHandler.isBracketPriceValid(\n                    result.newPrice,\n                    result.bracketType,\n                    parentPrice,\n                    parentSide,\n                    marketPrice\n                )\n            ) {\n                this.tradeDragNewPrice = null;\n                this.renderTradeLayer();\n                return;\n            }\n        }\n\n        // Main entry price market-side validation (pending orders)\n        if (!result.bracketType) {\n            const pendingLvl = this.levels.find((l) => l.label === result.label) as\n                | { side?: 'buy' | 'sell'; orderType?: 'limit' | 'stop'; data?: unknown }\n                | undefined;\n            if (pendingLvl?.orderType && pendingLvl?.side) {\n                const allBars = this.dataStore.all;\n                const mktPrice = allBars[allBars.length - 1]?.close ?? 0;\n                if (mktPrice > 0) {\n                    const mustBeBelowMarket =\n                        (pendingLvl.side === 'buy' && pendingLvl.orderType === 'limit') ||\n                        (pendingLvl.side === 'sell' && pendingLvl.orderType === 'stop');\n                    const valid = mustBeBelowMarket\n                        ? result.newPrice < mktPrice\n                        : result.newPrice > mktPrice;\n                    if (!valid) {\n                        this.tradeDragNewPrice = null;\n                        this.renderTradeLayer();\n                        return;\n                    }\n                }\n            }\n        }\n\n        // Zero-delta safety net: if the drag finished exactly where it started, don't stage\n        // a pending change. The mousedown threshold (see _pendingTradeDrag) already prevents\n        // zero-delta drags from starting on click, but this guards against any future path\n        // that might bypass it — without it a zero-delta entry would surface Confirm/Cancel\n        // buttons and block the outside-click deselect path.\n        if (result.newPrice === oldPrice) {\n            this.tradeDragNewPrice = null;\n            this.renderTradeLayer();\n            return;\n        }\n\n        // Accumulate in the pending map (replace same-field entry if re-dragged)\n        const field: 'main' | 'stopLoss' | 'takeProfit' = result.bracketType ?? 'main';\n        const isNew = this._isBracketNew;\n        this._isBracketNew = false;\n\n        // Market drafts auto-commit bracket drags immediately — no confirm button\n        const draggedLevel = this.levels.find((l) => l.label === result.label) as\n            | PendingOrderLevel\n            | undefined;\n        const isMarketDraft =\n            draggedLevel?.orderType === 'market' &&\n            (draggedLevel?.data as { _isDraft?: boolean } | undefined)?._isDraft === true;\n        if (isMarketDraft) {\n            if (field !== 'main') {\n                this.updateDraftOrderBracket(field === 'stopLoss' ? 'sl' : 'tp', result.newPrice);\n                this.emitter.emit('tradeLevelDrag', {\n                    label: result.label,\n                    newPrice: result.newPrice,\n                    data: draggedLevel?.data,\n                    bracketType: field as 'stopLoss' | 'takeProfit',\n                    isFullscreen: this.isFullscreen,\n                });\n            }\n            this.tradeDragNewPrice = null;\n            this.renderTradeLayer();\n            return;\n        }\n\n        // Limit/stop drafts: bracket drags update the price inline — never auto-submit the order.\n        // (Market drafts already handle this above; this covers limit/stop drafts.)\n        const isLimitStopDraft =\n            draggedLevel !== undefined &&\n            field !== 'main' &&\n            (draggedLevel?.data as { _isDraft?: boolean } | undefined)?._isDraft === true;\n        if (isLimitStopDraft) {\n            this.updateDraftOrderBracket(field === 'stopLoss' ? 'sl' : 'tp', result.newPrice);\n            this.emitter.emit('tradeLevelDrag', {\n                label: result.label,\n                newPrice: result.newPrice,\n                data: draggedLevel?.data,\n                bracketType: field as 'stopLoss' | 'takeProfit',\n                isFullscreen: this.isFullscreen,\n            });\n            this.tradeDragNewPrice = null;\n            this.renderTradeLayer();\n            return;\n        }\n\n        // Mobile mode: Limit/Stop draft main-line drag — update entry price inline, don't submit.\n        const isLimitStopDraftMainMobile =\n            draggedLevel !== undefined &&\n            field === 'main' &&\n            (draggedLevel?.data as { _isDraft?: boolean } | undefined)?._isDraft === true &&\n            (draggedLevel as PendingOrderLevel).orderType !== 'market' &&\n            this.hideLevelConfirmCancel;\n        if (isLimitStopDraftMainMobile) {\n            this.updateDraftOrderPrice(result.newPrice);\n            this.emitter.emit('tradeLevelDrag', {\n                label: result.label,\n                newPrice: result.newPrice,\n                data: draggedLevel?.data,\n                bracketType: undefined,\n                isFullscreen: this.isFullscreen,\n            });\n            this.tradeDragNewPrice = null;\n            this.renderTradeLayer();\n            return;\n        }\n\n        const existing = this.pendingLevelDrags.get(result.label) ?? [];\n        const filtered = existing.filter((c) => c.field !== field);\n        filtered.push({ field, newPrice: result.newPrice, oldPrice, isNew, bracketOrderLabel });\n        this.pendingLevelDrags.set(result.label, filtered);\n\n        this.tradeDragNewPrice = null;\n\n        // Mobile mode: no confirm/cancel buttons — auto-apply immediately so tradeLevelEdit fires.\n        // `skipAutoApply` lets a caller accumulate multiple changes (e.g. follow-brackets\n        // MAIN+SL+TP) before triggering a single atomic apply on the final invocation.\n        if (this.hideLevelConfirmCancel && !skipAutoApply) {\n            this.applyPendingChanges(result.label);\n            return;\n        }\n\n        this.renderTradeLayer();\n    }\n\n    private _orderTypeForPrice(\n        side: 'buy' | 'sell',\n        price: number,\n    ): 'limit' | 'stop' {\n        const bars = this.dataStore.all;\n        const lastClose = bars.length > 0 ? bars[bars.length - 1].close : price;\n        if (side === 'buy') return price < lastClose ? 'limit' : 'stop';\n        return price > lastClose ? 'limit' : 'stop';\n    }\n\n    private createDraftOrder(\n        side: 'buy' | 'sell',\n        price: number,\n        orderType: 'limit' | 'stop'\n    ): void {\n        if (this.draftOrderLabel) return; // one draft at a time\n        const label = `__draft_${Date.now()}`;\n        const draftLevel: PendingOrderLevel = {\n            type: 'pending',\n            label,\n            side,\n            price,\n            orderType,\n            lots: this._qtyFieldMin,\n            data: { _isDraft: true },\n        };\n        this.levels = [...this.levels, draftLevel];\n        this.draftOrderLabel = label;\n        this.selectedTradeLabel = label;\n        // Seed pendingLevelDrags so confirm/cancel buttons appear immediately\n        this.pendingLevelDrags.set(label, [{ field: 'main', newPrice: price, oldPrice: price }]);\n        this.crosshair = null;\n        this.renderTradeLayer();\n        this.emitter.emit('draftInitiated', {\n            side,\n            price,\n            orderType,\n            isFullscreen: this.isFullscreen,\n        });\n    }\n\n    private removeDraftOrder(): void {\n        if (!this.draftOrderLabel) return;\n        const label = this.draftOrderLabel;\n        this.levels = this.levels.filter((l) => l.label !== label);\n        this.pendingLevelDrags.delete(label);\n        this.selectedTradeLabel = null;\n        this.draftOrderLabel = null;\n        this.draftBracketPnl = {};\n        this._draftQtyFlyout?.hide();\n        this._draftQtyPillArea = undefined;\n        this.renderTradeLayer();\n        this.emitter.emit('draftCancelled', { label, isFullscreen: this.isFullscreen });\n    }\n\n    private applyPendingChanges(label: string): void {\n        const changes = this.pendingLevelDrags.get(label);\n        if (!changes) {\n            // Edit form is open with no staged drags (e.g. user clicked the ✓ on an\n            // edit-without-SL/TP session). Signal confirmed + close the form so the host\n            // panel can commit whatever form-local state it holds.\n            if (this._editOpenLabel === label) {\n                const level = this.levels.find((l) => l.label === label);\n                this._editOpenLabel = null;\n                this.selectedTradeLabel = null;\n                this.renderTradeLayer();\n                if (level) {\n                    this.emitter.emit('tradeLevelConfirmed', {\n                        label,\n                        type: level.type as TradeLevelType,\n                        isFullscreen: this.isFullscreen,\n                    });\n                }\n            }\n            return;\n        }\n        const level = this.levels.find((l) => l.label === label);\n        if (!level) return;\n\n        if (this._editOpenLabel === label) this._editOpenLabel = null;\n\n        // Intercept draft orders — call onOrderSubmit instead of emitting tradeLevelEdit\n        if (label === this.draftOrderLabel) {\n            const mainEntry = changes.find((c) => c.field === 'main');\n            const draft = level as PendingOrderLevel;\n            this._onOrderSubmit?.({\n                price: mainEntry?.newPrice ?? draft.price,\n                lots: draft.lots ?? this._qtyFieldMin,\n                side: draft.side,\n                orderType: draft.orderType,\n                ...(draft.stopLossPrice !== undefined ? { stopLoss: draft.stopLossPrice } : {}),\n                ...(draft.takeProfitPrice !== undefined ? { takeProfit: draft.takeProfitPrice } : {}),\n            });\n            this.emitter.emit('tradeLevelConfirmed', {\n                label,\n                type: 'draft',\n                isFullscreen: this.isFullscreen,\n            });\n            this.removeDraftOrder();\n            return;\n        }\n\n        // Emit all changes as a single event (suppressed when host provides its own confirm/cancel UI)\n        const newLots = this.pendingQtyChanges.get(label);\n        this.pendingQtyChanges.delete(label);\n        this.originalQtyByLabel.delete(label);\n        // When qty was edited, overlay the new value onto the parent-level data clone so\n        // host code reading `data.lots` sees the effective qty without having to separately\n        // destructure `newLots`.\n        const parentData: unknown = newLots !== undefined && level.data && typeof level.data === 'object'\n            ? { ...(level.data as Record<string, unknown>), lots: newLots }\n            : level.data;\n        this.emitter.emit('tradeLevelEdit', {\n            label,\n            type: level.type as TradeLevelType,\n            data: parentData,\n            isFullscreen: this.isFullscreen,\n            ...(newLots !== undefined ? { newLots } : {}),\n            changes: changes.map((c) => {\n                type LevelWithBracketData = { stopLossData?: unknown; takeProfitData?: unknown };\n                const lbd = level.data as LevelWithBracketData;\n\n                // Resolve per-bracket data: inline field → ToClose order → parent fallback\n                let changeData: unknown = parentData;\n                if (c.field === 'stopLoss') {\n                    changeData = lbd.stopLossData ?? level.data;\n                } else if (c.field === 'takeProfit') {\n                    changeData = lbd.takeProfitData ?? level.data;\n                }\n                if (c.bracketOrderLabel) {\n                    const bracketOrder = this.levels.find((l) => l.label === c.bracketOrderLabel);\n                    if (bracketOrder) changeData = bracketOrder.data;\n                }\n\n                let emitField:\n                    | 'MAIN'\n                    | 'SL'\n                    | 'TP'\n                    | 'ADD_SL'\n                    | 'ADD_TP'\n                    | 'REMOVE_SL'\n                    | 'REMOVE_TP';\n                if (c.field === 'main') emitField = 'MAIN';\n                else if (c.field === 'stopLoss')\n                    emitField = c.isRemoval ? 'REMOVE_SL' : c.isNew ? 'ADD_SL' : 'SL';\n                else emitField = c.isRemoval ? 'REMOVE_TP' : c.isNew ? 'ADD_TP' : 'TP';\n\n                return {\n                    field: emitField,\n                    newPrice: c.newPrice,\n                    data: changeData,\n                    ...(emitField === 'MAIN' && newLots !== undefined ? { newLots } : {}),\n                    bracketOrderLabel: c.bracketOrderLabel,\n                };\n            }),\n        });\n\n        this.emitter.emit('tradeLevelConfirmed', {\n            label,\n            type: level.type as TradeLevelType,\n            isFullscreen: this.isFullscreen,\n        });\n        if (this.hideLevelConfirmCancel) {\n            // Mobile: keep pendingLevelDrags AND selectedTradeLabel so the label stays visible\n            // at the dragged position. setLevels clears both once the server confirms.\n        } else {\n            this.pendingLevelDrags.delete(label);\n            this.selectedTradeLabel = null;\n            this.draftBracketPnl = {};\n        }\n        this.renderTradeLayer();\n    }\n\n    private revertPendingChanges(label?: string): void {\n        // Intercept draft order cancellation\n        if (label && label === this.draftOrderLabel) {\n            this.removeDraftOrder();\n            return;\n        }\n        // If reverting all and there's an active draft, remove it too\n        if (!label && this.draftOrderLabel) {\n            this.removeDraftOrder();\n        }\n\n        // Edit form open with no staged drags — ✗ click should still close the form\n        // and notify the host. The loop below is a no-op here because `toRevert` is empty.\n        if (label && !this.pendingLevelDrags.has(label) && this._editOpenLabel === label) {\n            this._cancelEditAndDeselect(label);\n            return;\n        }\n\n        const toRevert: Array<\n            [\n                string,\n                Array<{\n                    field: 'main' | 'stopLoss' | 'takeProfit';\n                    newPrice: number;\n                    oldPrice: number;\n                    bracketOrderLabel?: string;\n                }>,\n            ]\n        > = label\n            ? this.pendingLevelDrags.has(label)\n                ? [[label, this.pendingLevelDrags.get(label) ?? []]]\n                : []\n            : [...this.pendingLevelDrags.entries()];\n\n        for (const [lbl] of toRevert) {\n            this.undoIsNewBracketMutations(lbl);\n            this.pendingLevelDrags.delete(lbl);\n            // Revert any qty change made via the flyout during this edit session\n            if (this.pendingQtyChanges.has(lbl)) {\n                this.pendingQtyChanges.delete(lbl);\n                const idx = this.levels.findIndex((l) => l.label === lbl);\n                if (idx !== -1 && this.originalQtyByLabel.has(lbl)) {\n                    const orig = this.originalQtyByLabel.get(lbl);\n                    const lvl = this.levels[idx] as PendingOrderLevel | PositionLevel;\n                    this.levels = [\n                        ...this.levels.slice(0, idx),\n                        { ...lvl, lots: orig } as AnyLevel,\n                        ...this.levels.slice(idx + 1),\n                    ];\n                }\n                this.originalQtyByLabel.delete(lbl);\n            }\n            const revertedLvl = this.levels.find((l) => l.label === lbl);\n            if (revertedLvl) {\n                if (this._editOpenLabel === lbl) this._editOpenLabel = null;\n                this.emitter.emit('tradeLevelEditCancelled', {\n                    label: lbl,\n                    type: revertedLvl.type as TradeLevelType,\n                    isFullscreen: this.isFullscreen,\n                });\n            }\n        }\n        this.selectedTradeLabel = null;\n        this.draftBracketPnl = {};\n        this.renderTradeLayer();\n    }\n\n    // addLevelBracket mutates `this.levels[i].stopLossPrice/takeProfitPrice` synchronously\n    // and also stages an `isNew: true` pending drag. When the edit is cancelled, the pending\n    // drag alone isn't enough — the level mutation must be undone too, otherwise the bracket\n    // keeps rendering.\n    private undoIsNewBracketMutations(label: string): void {\n        const changes = this.pendingLevelDrags.get(label);\n        if (!changes) return;\n        const slIsNew = changes.some((c) => c.field === 'stopLoss' && c.isNew);\n        const tpIsNew = changes.some((c) => c.field === 'takeProfit' && c.isNew);\n        if (!slIsNew && !tpIsNew) return;\n        this.levels = this.levels.map((l) => {\n            if (l.label !== label) return l;\n            const next = { ...l } as PositionLevel | PendingOrderLevel;\n            if (slIsNew) next.stopLossPrice = undefined;\n            if (tpIsNew) next.takeProfitPrice = undefined;\n            return next;\n        });\n    }\n\n    private render(): void {\n        if (this._isDestroyed) return;\n        const { ctx, canvas, theme, viewport } = this;\n        const dpr = window.devicePixelRatio || 1;\n        const totalW = canvas.width;\n        const totalH = canvas.height;\n\n        const chartW = totalW / dpr - this.priceAxisWidth;\n\n        // Sub-pane layout — includes hidden panes so they keep their reserved space\n        const allSubPaneStates = this.activeIndicators.filter((s) => s.indicator.pane === 'sub');\n        const subPanes = allSubPaneStates.map((s) => s.indicator);\n        const subPanesH = subPanes.reduce((acc, ind) => acc + this.paneH(ind) + PANE_SEPARATOR, 0);\n\n        const priceH = totalH / dpr - this.timeAxisHeight - subPanesH;\n\n        ctx.clearRect(0, 0, totalW, totalH);\n        ctx.fillStyle = theme.background;\n        ctx.fillRect(0, 0, totalW, totalH);\n\n        const bars = this.dataStore.getVisible(viewport);\n        if (bars.length === 0) {\n            this.drawCtx.clearRect(0, 0, this.drawCanvas.width, this.drawCanvas.height);\n            return;\n        }\n\n        // ── Viewport lerp (horizontal pan/zoom smoothing) ─────────────────────\n        {\n            // During active drag, snap immediately — lerp during drag causes finger lag on touch\n            if (this._isPanning) {\n                this.viewport = { ...this._targetViewport };\n            } else {\n                const dStart = this._targetViewport.startIndex - this.viewport.startIndex;\n                const dEnd = this._targetViewport.endIndex - this.viewport.endIndex;\n                const visibleBars = this._targetViewport.endIndex - this._targetViewport.startIndex;\n                const epsilon = visibleBars * 0.0002;\n                if (Math.abs(dStart) < epsilon && Math.abs(dEnd) < epsilon) {\n                    this.viewport = { ...this._targetViewport };\n                } else {\n                    this.viewport = {\n                        ...this.viewport,\n                        startIndex: this.viewport.startIndex + dStart * VIEWPORT_LERP,\n                        endIndex: this.viewport.endIndex + dEnd * VIEWPORT_LERP,\n                        candleWidth: this._targetViewport.candleWidth,\n                        candleGap: this._targetViewport.candleGap,\n                    };\n                    this.scheduleRender();\n                }\n            }\n        }\n\n        const isManualMode = this.priceScaleFactor !== 1.0 || this.pricePanOffset !== 0;\n\n        if (!isManualMode) {\n            // Auto-fit: lerp displayed range toward visible-bars range each frame\n            this._lockedAutoFitBase = null;\n            const targetRange = this.getScaledPriceRange(viewport);\n            if (!this._displayedPriceRange) {\n                this._displayedPriceRange = targetRange;\n            } else {\n                const epsilon = (targetRange.max - targetRange.min) * 0.0001;\n                const dMin = targetRange.min - this._displayedPriceRange.min;\n                const dMax = targetRange.max - this._displayedPriceRange.max;\n                if (Math.abs(dMin) < epsilon && Math.abs(dMax) < epsilon) {\n                    this._displayedPriceRange = targetRange;\n                } else {\n                    this._displayedPriceRange = {\n                        min: this._displayedPriceRange.min + dMin * PRICE_RANGE_LERP,\n                        max: this._displayedPriceRange.max + dMax * PRICE_RANGE_LERP,\n                    };\n                    this.scheduleRender();\n                }\n            }\n        } else {\n            // Manual mode: lock the range on first entry; apply scale/pan on top each frame.\n            // The locked base never updates on horizontal scroll so the Y range stays fully fixed.\n            if (!this._lockedAutoFitBase) {\n                this._lockedAutoFitBase =\n                    this._displayedPriceRange ?? this.dataStore.getPriceRange(viewport);\n            }\n            const base = this._lockedAutoFitBase;\n            const mid = (base.min + base.max) / 2 + this.pricePanOffset;\n            const halfSpan = base.max !== base.min ? (base.max - base.min) / 2 : 1;\n            this._displayedPriceRange = {\n                min: mid - halfSpan * this.priceScaleFactor,\n                max: mid + halfSpan * this.priceScaleFactor,\n            };\n        }\n        const priceRange = this._displayedPriceRange!;\n        const volRange = this.showVolume ? this.dataStore.getVolumeRange(viewport) : null;\n\n        // Expose for indicators that use the canvas tag pattern\n        const tagged = canvas as TaggedCanvas;\n        tagged._priceRange = priceRange;\n        tagged._chartWidth = chartW;\n\n        ctx.save();\n        ctx.scale(dpr, dpr);\n\n        // ── Price pane ────────────────────────────────────────────────────────\n\n        // Clip to price pane so candles/grid/volume never bleed into axes\n        ctx.save();\n        ctx.beginPath();\n        ctx.rect(0, 0, chartW, priceH);\n        ctx.clip();\n\n        renderGrid(ctx, priceRange, this.scaleManager, theme, chartW, priceH);\n\n        switch (this.series) {\n            case 'candlestick':\n                renderCandlestick(\n                    ctx,\n                    bars,\n                    viewport,\n                    priceRange,\n                    this.scaleManager,\n                    theme,\n                    chartW,\n                    priceH\n                );\n                break;\n            case 'hollow':\n                renderHollowCandle(\n                    ctx,\n                    bars,\n                    viewport,\n                    priceRange,\n                    this.scaleManager,\n                    theme,\n                    chartW,\n                    priceH\n                );\n                break;\n            case 'line':\n                renderLine(\n                    ctx,\n                    bars,\n                    viewport,\n                    priceRange,\n                    this.scaleManager,\n                    theme,\n                    chartW,\n                    priceH,\n                    false\n                );\n                break;\n            case 'area':\n                renderLine(\n                    ctx,\n                    bars,\n                    viewport,\n                    priceRange,\n                    this.scaleManager,\n                    theme,\n                    chartW,\n                    priceH,\n                    true\n                );\n                break;\n            case 'ohlc':\n                renderOHLC(\n                    ctx,\n                    bars,\n                    viewport,\n                    priceRange,\n                    this.scaleManager,\n                    theme,\n                    chartW,\n                    priceH\n                );\n                break;\n            case 'heikinashi':\n                renderHeikinAshi(\n                    ctx,\n                    bars,\n                    viewport,\n                    priceRange,\n                    this.scaleManager,\n                    theme,\n                    chartW,\n                    priceH\n                );\n                break;\n            case 'volumecandles':\n                renderVolumeCandles(\n                    ctx,\n                    bars,\n                    viewport,\n                    priceRange,\n                    this.scaleManager,\n                    theme,\n                    chartW,\n                    priceH\n                );\n                break;\n            case 'linemarkers':\n                renderLineWithMarkers(\n                    ctx,\n                    bars,\n                    viewport,\n                    priceRange,\n                    this.scaleManager,\n                    theme,\n                    chartW,\n                    priceH\n                );\n                break;\n            case 'step':\n                renderStepLine(\n                    ctx,\n                    bars,\n                    viewport,\n                    priceRange,\n                    this.scaleManager,\n                    theme,\n                    chartW,\n                    priceH\n                );\n                break;\n            case 'hlcarea':\n                renderHLCArea(\n                    ctx,\n                    bars,\n                    viewport,\n                    priceRange,\n                    this.scaleManager,\n                    theme,\n                    chartW,\n                    priceH\n                );\n                break;\n            case 'baseline':\n                renderBaseline(\n                    ctx,\n                    bars,\n                    viewport,\n                    priceRange,\n                    this.scaleManager,\n                    theme,\n                    chartW,\n                    priceH\n                );\n                break;\n            case 'columns':\n                renderColumns(\n                    ctx,\n                    bars,\n                    viewport,\n                    priceRange,\n                    this.scaleManager,\n                    theme,\n                    chartW,\n                    priceH\n                );\n                break;\n            case 'highlow':\n                renderHighLow(\n                    ctx,\n                    bars,\n                    viewport,\n                    priceRange,\n                    this.scaleManager,\n                    theme,\n                    chartW,\n                    priceH\n                );\n                break;\n        }\n\n        // Main-pane (overlay) indicators\n        ctx.save();\n        ctx.beginPath();\n        ctx.rect(0, 0, chartW, priceH);\n        ctx.clip();\n        for (const ind of this.indicators.filter((i) => !i.pane || i.pane === 'main')) {\n            const results = this.indicatorResults.get(ind.name);\n            if (!results) continue;\n            const visible = results.slice(\n                Math.floor(viewport.startIndex),\n                Math.ceil(viewport.endIndex) + 1\n            );\n            ind.render(ctx, visible, this.scaleManager, viewport, priceH);\n        }\n        ctx.restore();\n        ctx.restore(); // end price-pane clip\n\n        renderPriceAxis(\n            ctx,\n            priceRange,\n            this.scaleManager,\n            theme,\n            chartW,\n            priceH,\n            this.priceAxisWidth,\n            undefined,\n            this.dataStore.getPricePrecision(),\n            this.uiConfig.priceAxis\n        );\n\n        // Trade levels are rendered on the dedicated tradeCanvas layer via renderTradeLayer()\n\n        // ── Bid / Ask price lines ─────────────────────────────────────────────\n\n        const lastBar = this.dataStore.all[this.dataStore.all.length - 1];\n        if (lastBar) {\n            const precision = this.dataStore.getPricePrecision();\n            const tagH = 16;\n\n            const drawPriceLine = (\n                price: number,\n                color: string,\n                prefix: string,\n            ): { y: number; boxW: number } => {\n                const y = this.scaleManager.yToPixel(price, priceRange, priceH);\n                ctx.save();\n                ctx.strokeStyle = color;\n                ctx.lineWidth = 1;\n                ctx.setLineDash([3, 3]);\n                ctx.beginPath();\n                ctx.moveTo(0, y);\n                ctx.lineTo(chartW, y);\n                ctx.stroke();\n                ctx.setLineDash([]);\n\n                const label = prefix + price.toFixed(precision);\n                ctx.font = \"10px 'Inter', system-ui, sans-serif\";\n                const tw = ctx.measureText(label).width;\n                const boxW = tw + 12;\n                ctx.fillStyle = color;\n                ctx.fillRect(chartW, y - tagH / 2, boxW, tagH);\n                ctx.fillStyle = '#ffffff';\n                ctx.textAlign = 'left';\n                ctx.fillText(label, chartW + 4, y + 4);\n                ctx.restore();\n                return { y, boxW };\n            };\n\n            // Anchor info for the countdown box stacked below the primary tag.\n            let primaryPriceY: number | null = null;\n            let primaryPriceBoxW = 0;\n            if (this.liveBidAsk) {\n                const { bid, ask } = this.liveBidAsk;\n                if (this.showBidAskLines) {\n                    // Show full spread — both lines. Anchor countdown to the\n                    // tickClosePriceSource side so it sits under a known tag.\n                    const bidTag = drawPriceLine(bid, theme.candle.down, '');\n                    const askTag = drawPriceLine(ask, theme.candle.up, '');\n                    const primary = this.tickClosePriceSource === 'ask' ? askTag : bidTag;\n                    primaryPriceY = primary.y;\n                    primaryPriceBoxW = primary.boxW;\n                } else {\n                    // Show only the side that matches tickClosePriceSource\n                    const price = this.tickClosePriceSource === 'ask' ? ask : bid;\n                    const color =\n                        this.tickClosePriceSource === 'ask' ? theme.candle.up : theme.candle.down;\n                    const tag = drawPriceLine(price, color, '');\n                    primaryPriceY = tag.y;\n                    primaryPriceBoxW = tag.boxW;\n                }\n            } else {\n                // No live tick yet — show last close\n                const isUp = lastBar.close >= lastBar.open;\n                const tag = drawPriceLine(\n                    lastBar.close,\n                    isUp ? theme.candle.up : theme.candle.down,\n                    '',\n                );\n                primaryPriceY = tag.y;\n                primaryPriceBoxW = tag.boxW;\n            }\n\n            // ── Price-axis countdown (sits flush below the live price tag) ───\n            if (this.showPriceAxisCountdown && primaryPriceY !== null) {\n                const INTRADAY_TF: Timeframe[] = ['1m', '5m', '15m', '30m', '1h', '2h', '4h', '8h'];\n                const allowed =\n                    this.candleCountdownTimeframes === 'all'\n                        ? true\n                        : (this.candleCountdownTimeframes ?? INTRADAY_TF).includes(\n                              this.timeframe as Timeframe,\n                          );\n                if (allowed) {\n                    const intervalMs = this.timeframeToMs(this.timeframe as Timeframe);\n                    renderPriceAxisCountdown(\n                        ctx,\n                        lastBar.time,\n                        intervalMs,\n                        theme,\n                        chartW,\n                        primaryPriceY - tagH / 2,\n                        tagH,\n                        primaryPriceBoxW,\n                    );\n                }\n            }\n        }\n\n        // ── Sub-panes (RSI, MACD, …) ──────────────────────────────────────────\n\n        let subPaneY = priceH;\n        for (const subState of allSubPaneStates) {\n            const ind = subState.indicator;\n            const paneH = this.paneH(ind);\n\n            // Separator line\n            ctx.fillStyle = theme.axisBorder;\n            ctx.fillRect(0, subPaneY, chartW + this.priceAxisWidth, PANE_SEPARATOR);\n            subPaneY += PANE_SEPARATOR;\n\n            // Clip and translate to pane\n            ctx.save();\n            ctx.beginPath();\n            ctx.rect(0, subPaneY, chartW + this.priceAxisWidth, paneH);\n            ctx.clip();\n            ctx.translate(0, subPaneY);\n\n            // Sub-pane background\n            ctx.fillStyle = theme.background;\n            ctx.fillRect(0, 0, chartW + this.priceAxisWidth, paneH);\n\n            // Only render indicator content when it is visible\n            const isVisible =\n                subState.visible &&\n                ((): boolean => {\n                    const tf = subState.currentParams['timeframe'] as string | undefined;\n                    return !tf || tf === 'Chart' || tf === this.timeframe;\n                })();\n\n            if (isVisible) {\n                const results = this.indicatorResults.get(ind.name);\n                if (results) {\n                    const visible = results.slice(\n                        Math.floor(viewport.startIndex),\n                        Math.ceil(viewport.endIndex) + 1\n                    );\n                    const baseRange = ind.getValueRange?.(visible);\n                    const scaleFactor = this.subPaneScaleFactors.get(ind.name) ?? 1;\n                    const scaledRange = baseRange\n                        ? applySubPaneScale(baseRange, scaleFactor)\n                        : undefined;\n                    ind.render(ctx, visible, this.scaleManager, viewport, paneH, scaledRange);\n                    if (scaledRange) {\n                        renderPriceAxis(\n                            ctx,\n                            scaledRange,\n                            this.scaleManager,\n                            theme,\n                            chartW,\n                            paneH,\n                            this.priceAxisWidth,\n                            3,\n                            subPaneAxisPrecision(scaledRange),\n                            this.uiConfig.priceAxis\n                        );\n                    }\n                }\n            }\n\n            ctx.restore();\n            subPaneY += paneH;\n        }\n\n        // ── Volume overlay (bottom of price pane) ─────────────────────────────\n\n        if (this.showVolume && volRange && volRange.max > 0) {\n            const volOverlayH = priceH * VOLUME_PANEL_RATIO;\n            renderVolume(\n                ctx,\n                bars,\n                viewport,\n                volRange.max,\n                this.scaleManager,\n                theme,\n                chartW,\n                volOverlayH,\n                priceH - volOverlayH\n            );\n        }\n\n        // ── Time axis ─────────────────────────────────────────────────────────\n\n        {\n            const INTRADAY_TF: Timeframe[] = ['1m', '5m', '15m', '30m', '1h', '2h', '4h', '8h'];\n            const countdownAllowed =\n                this.candleCountdownTimeframes === 'all'\n                    ? true\n                    : (this.candleCountdownTimeframes ?? INTRADAY_TF).includes(\n                          this.timeframe as Timeframe\n                      );\n            const showCountdown =\n                this.showCandleCountdown &&\n                !this.showPriceAxisCountdown &&\n                countdownAllowed &&\n                bars.length > 0 &&\n                viewport.endIndex >= this.dataStore.length - 1;\n            const countdownBarIndex = showCountdown ? this.dataStore.length - 1 : undefined;\n\n            if (this._debug) {\n                // eslint-disable-next-line no-console\n                console.log(\n                    '[countdown] showCandleCountdown:',\n                    this.showCandleCountdown,\n                    '| tf:',\n                    this.timeframe,\n                    '| allowed:',\n                    countdownAllowed,\n                    '| bars:',\n                    bars.length,\n                    '| endIndex:',\n                    viewport.endIndex,\n                    '| dataLen:',\n                    this.dataStore.length,\n                    '| atLiveEdge:',\n                    viewport.endIndex >= this.dataStore.length - 1\n                );\n            }\n\n            renderTimeAxis(\n                ctx,\n                bars,\n                viewport,\n                this.scaleManager,\n                theme,\n                chartW,\n                subPaneY,\n                isMobileDevice() ? 3 : undefined,\n                this.uiConfig.timeAxis,\n                this.timeframe,\n                countdownBarIndex,\n                this.timezone\n            );\n\n            // ── Candle countdown ──────────────────────────────────────────────\n\n            if (showCountdown) {\n                const lastBar = this.dataStore.all[this.dataStore.length - 1];\n                if (lastBar) {\n                    const intervalMs = this.timeframeToMs(this.timeframe as Timeframe);\n                    renderCandleCountdown(\n                        ctx,\n                        lastBar.time,\n                        intervalMs,\n                        this.dataStore.length - 1,\n                        viewport,\n                        this.scaleManager,\n                        theme,\n                        chartW,\n                        subPaneY,\n                        this.uiConfig.timeAxis\n                    );\n                }\n            }\n        }\n\n        // ── Crosshair ─────────────────────────────────────────────────────────\n\n        if (this.crosshair) {\n            renderCrosshair(\n                ctx,\n                this.crosshair,\n                priceRange,\n                viewport,\n                this.scaleManager,\n                theme,\n                chartW,\n                priceH,\n                this.priceAxisWidth,\n                subPaneY,\n                this.timeframe,\n                this.dataStore.getPricePrecision(),\n                this.uiConfig.crosshair,\n                this.timezone\n            );\n        }\n\n        // ── Watermark logo (bottom-left of price pane) ────────────────────────\n\n        if (this.logoImage) {\n            const logoSize = 40;\n            const margin = 20;\n            const cx = margin + logoSize / 2; // circle center x\n            const cy = priceH - margin - logoSize / 2; // circle center y, anchored from bottom\n            ctx.save();\n            ctx.globalAlpha = 0.6;\n            // Clip to price pane so logo never bleeds into axes/sub-panes\n            ctx.beginPath();\n            ctx.rect(0, 0, chartW, priceH);\n            ctx.clip();\n            // Circle clip\n            ctx.beginPath();\n            ctx.arc(cx, cy, logoSize / 2, 0, Math.PI * 2);\n            ctx.closePath();\n            ctx.clip();\n            ctx.drawImage(this.logoImage, cx - logoSize / 2, cy - logoSize / 2, logoSize, logoSize);\n            ctx.restore();\n        }\n\n        ctx.restore();\n\n        // ── Symbol info OHLC strip ────────────────────────────────────────────\n        const ohlcBar = this.crosshair\n            ? (this.dataStore.all[this.crosshair.barIndex] ?? null)\n            : (this.dataStore.all[this.dataStore.length - 1] ?? null);\n        this.renderSymbolInfoOHLC(ohlcBar);\n\n        // ── Drawing overlay ───────────────────────────────────────────────────\n\n        this.drawingManager.render(\n            this.drawCtx,\n            this.scaleManager,\n            viewport,\n            priceRange,\n            chartW,\n            priceH,\n            this.dataStore.getPricePrecision(),\n            this.theme,\n        );\n\n        // Keep the floating drawing-style popover anchored to its drawing as\n        // the user pans/zooms.\n        if (this.drawingStylePopover) {\n            const sel = this.drawingManager.getSelectedDrawing();\n            if (sel && sel.complete && sel.locked !== true) {\n                const anchor = this.computeDrawingAnchorPx(sel);\n                if (anchor) this.drawingStylePopover.setAnchor(anchor.x, anchor.y);\n            }\n        }\n\n        // Show scroll-to-end button when the last candle has scrolled off-screen\n        if (this.scrollToEndBtn) {\n            const atEnd =\n                this.dataStore.length === 0 ||\n                this._targetViewport.endIndex >= this.dataStore.length - 0.5;\n            if (atEnd !== !this.scrollToEndVisible) {\n                this.scrollToEndVisible = !atEnd;\n                this.scrollToEndBtn.style.opacity = atEnd ? '0' : '0.85';\n                this.scrollToEndBtn.style.pointerEvents = atEnd ? 'none' : 'auto';\n            }\n        }\n\n        // Show reset-view button when the viewport has deviated from the default\n        if (this.resetViewBtn) {\n            const total = this.dataStore.length;\n            const defaultVisible = this._defaultVisibleBars;\n            const atLiveEdge = total === 0 || this._targetViewport.endIndex >= total - 0.5;\n            const visibleBars =\n                this._targetViewport.endIndex - this._targetViewport.startIndex;\n            const atDefaultZoom = Math.abs(visibleBars - defaultVisible) < 0.5;\n            const atDefaultPrice =\n                this.priceScaleFactor === 1.0 &&\n                this.pricePanOffset === 0 &&\n                this._lockedAutoFitBase === null;\n            const atDefault =\n                total === 0 || (atLiveEdge && atDefaultZoom && atDefaultPrice);\n            if (atDefault === this.resetViewVisible) {\n                this.resetViewVisible = !atDefault;\n                this.resetViewBtn.style.opacity = atDefault ? '0' : '0.75';\n                this.resetViewBtn.style.pointerEvents = atDefault ? 'none' : 'auto';\n            }\n        }\n\n        // Update sub-pane overlay positions after layout is fully rendered\n        this.updateSubPaneOverlayPositions();\n    }\n\n    // ── Private helpers ───────────────────────────────────────────────────────\n\n    private recomputeIndicators(): void {\n        for (const ind of this.indicators) {\n            this.indicatorResults.set(ind.name, ind.compute(this.dataStore.all));\n        }\n    }\n\n    private onResize(): void {\n        if (this._isDestroyed) return;\n        const dpr = window.devicePixelRatio || 1;\n        const rect = this.canvasWrap.getBoundingClientRect();\n        // Detached or hidden container — nothing to paint and downstream\n        // calculations with zero dimensions can produce NaN that leaks into\n        // later state.\n        if (rect.width === 0 || rect.height === 0) return;\n        this._cachedWrapRect = rect;\n        this._cachedDrawRect = this.drawCanvas.getBoundingClientRect();\n        for (const c of [this.canvas, this.tradeCanvas, this.drawCanvas]) {\n            c.width = rect.width * dpr;\n            c.height = rect.height * dpr;\n        }\n\n        const totalWidth = this.wrapper.offsetWidth;\n        const isMobile =\n            totalWidth > 0 && totalWidth < this.uiConfig.drawingToolbar.mobileBreakpoint;\n        if (isMobile !== this._mobileLayout) {\n            this._mobileLayout = isMobile;\n            this.leftBar?.setMobileMode(isMobile);\n            this.topBar?.setMobileLayout(isMobile);\n            this.tradeButton?.setMobileMode(isMobile);\n            this.tradePopover?.setCompact(isMobile);\n            if (this.siEl) {\n                this.siEl.style.flexDirection = isMobile ? 'column' : 'row';\n                this.siEl.style.alignItems = isMobile ? 'flex-start' : 'center';\n                this.siEl.style.gap = isMobile ? '2px' : '8px';\n            }\n            if (isMobile) {\n                // Hide left bar by default on mobile; pencil button opens it\n                this.leftBarVisible = false;\n                this.topBar?.setDrawingsBtnActive(false);\n            } else {\n                // Restore left bar on desktop\n                this.leftBarVisible = true;\n                this.leftBar?.setVisible(true);\n                this.topBar?.setDrawingsBtnActive(true);\n            }\n        }\n        // Render synchronously here: ResizeObserver fires after layout but\n        // before paint, so a direct render() call lands on-screen this frame.\n        // scheduleRender() would queue a RAF that fires *next* frame, after the\n        // canvas has already been cleared, leaving it blank on every frame\n        // while a CSS width transition (e.g. the drawing toolbar toggle) runs.\n        if (this.rafId !== null) {\n            cancelAnimationFrame(this.rafId);\n            this.rafId = null;\n        }\n        this.render();\n        this.renderTradeLayer();\n    }\n\n    private paneH(ind: IIndicator): number {\n        return this.paneHeightOverrides.get(ind.name) ?? ind.paneHeight ?? SUB_PANE_HEIGHT;\n    }\n\n    /** Translate pixel + data space dimensions used for drawing hit-tests */\n    private getChartLayout() {\n        const subPanes = this.activeIndicators\n            .filter((s) => s.indicator.pane === 'sub')\n            .map((s) => s.indicator);\n        const subPanesH = subPanes.reduce((a, i) => a + this.paneH(i) + PANE_SEPARATOR, 0);\n        const rect = this._cachedWrapRect ?? this.canvasWrap.getBoundingClientRect();\n        const chartW = rect.width - this.priceAxisWidth;\n        const priceH = rect.height - this.timeAxisHeight - subPanesH;\n        return { chartW, priceH };\n    }\n\n    /**\n     * Returns canvasWrap-relative pixel coords of the topmost rendered point of\n     * a drawing — used to anchor the floating style popover above it. Returns\n     * null when the drawing has no on-screen points (e.g. fully clipped out).\n     */\n    private computeDrawingAnchorPx(drawing: import('./core/types.js').IDrawing): { x: number; y: number } | null {\n        if (drawing.points.length === 0) return null;\n        const { chartW, priceH } = this.getChartLayout();\n        const viewport = this._targetViewport;\n        const priceRange = this._displayedPriceRange ?? this.getScaledPriceRange(viewport);\n        let bestX = 0, bestY = Infinity;\n        for (const p of drawing.points) {\n            const x = this.scaleManager.xToPixel(p.barIndex, viewport, chartW);\n            const y = this.scaleManager.yToPixel(p.price, priceRange, priceH);\n            if (y < bestY) { bestY = y; bestX = x; }\n        }\n        if (!Number.isFinite(bestY)) return null;\n        // Clamp inside chart so the popover stays in-bounds even when drawing scrolled away.\n        bestX = Math.max(0, Math.min(chartW, bestX));\n        bestY = Math.max(0, Math.min(priceH, bestY));\n        return { x: bestX, y: bestY };\n    }\n\n    /** Repositions each sub-pane IndicatorOverlay element to sit at the top of its pane */\n    private updateSubPaneOverlayPositions(): void {\n        if (this.subPaneOverlays.size === 0) return;\n        const seps = this.getSeparatorPositions();\n        for (const sep of seps) {\n            const overlay = this.subPaneOverlays.get(sep.indicatorName);\n            if (overlay) {\n                overlay.el.style.top = `${sep.y + PANE_SEPARATOR + 6}px`;\n            }\n        }\n    }\n\n    /** Y positions (logical px) of each sub-pane top separator, used for drag-resize */\n    private getSeparatorPositions(): { y: number; indicatorName: string }[] {\n        const { priceH } = this.getChartLayout();\n        const subPanes = this.activeIndicators\n            .filter((s) => s.indicator.pane === 'sub')\n            .map((s) => s.indicator);\n        const result: { y: number; indicatorName: string }[] = [];\n        let y = priceH;\n        for (const ind of subPanes) {\n            result.push({ y, indicatorName: ind.name });\n            y += this.paneH(ind) + PANE_SEPARATOR;\n        }\n        return result;\n    }\n\n    private getScaledPriceRange(viewport: Viewport): PriceRange {\n        const base = this.dataStore.getPriceRange(viewport);\n        let rangeMin = base.min;\n        let rangeMax = base.max;\n\n        // Extend range to keep active overlay indicators fully in view\n        for (const ind of this.indicators.filter((i) => !i.pane || i.pane === 'main')) {\n            const results = this.indicatorResults.get(ind.name);\n            if (!results) continue;\n            const lo = Math.floor(viewport.startIndex);\n            const hi = Math.ceil(viewport.endIndex) + 1;\n            for (let idx = lo; idx < hi && idx < results.length; idx++) {\n                const v = results[idx]?.value;\n                if (v === null || v === undefined) continue;\n                const vals: number[] = Array.isArray(v)\n                    ? (v as (number | null)[]).filter((x): x is number => x !== null)\n                    : [v as number];\n                for (const n of vals) {\n                    if (isFinite(n)) {\n                        if (n < rangeMin) rangeMin = n;\n                        if (n > rangeMax) rangeMax = n;\n                    }\n                }\n            }\n        }\n\n        const mid = (rangeMin + rangeMax) / 2 + this.pricePanOffset;\n        const halfSpan = rangeMin === rangeMax ? 1 : (rangeMax - rangeMin) / 2;\n        return {\n            min: mid - halfSpan * this.priceScaleFactor,\n            max: mid + halfSpan * this.priceScaleFactor,\n        };\n    }\n\n    private onMouseMove = (e: MouseEvent): void => {\n        if (this._mobileCrosshairActive) return;\n        // Suppress synthetic mouse events fired by mobile browsers ~300ms after touchend\n        if (Date.now() - this._lastTouchTime < 500) return;\n        const rect = this._cachedDrawRect ?? this.drawCanvas.getBoundingClientRect();\n        const x = e.clientX - rect.left;\n        const y = e.clientY - rect.top;\n\n        const { chartW, priceH } = this.getChartLayout();\n        const priceRange = this._displayedPriceRange ?? this.getScaledPriceRange(this.viewport);\n\n        // Only show crosshair when mouse is inside the chart area, not over axes\n        const timeAxisY = rect.height - this.timeAxisHeight;\n        const isInChartArea = x < chartW && y < timeAxisY;\n\n        // Raw float coords — used for precise drawing placement\n        const rawBarIndex = this.scaleManager.pixelToBarIndex(x, this.viewport, chartW);\n        const price = this.scaleManager.pixelToPrice(y, priceRange, priceH);\n\n        // Rounded + clamped — used for crosshair bar snap and event payload\n        const clamped = Math.max(\n            Math.floor(this.viewport.startIndex),\n            Math.min(Math.ceil(this.viewport.endIndex), Math.round(rawBarIndex))\n        );\n        const bar = this.dataStore.all[clamped] ?? null;\n\n        this.crosshair =\n            isInChartArea && !this.tradePopover?.isVisible && this.selectedTradeLabel === null\n                ? { x, y, barIndex: clamped, price, bar }\n                : null;\n        if (this.crosshair) this.emitter.emit('crosshair', this.crosshair);\n\n        // Trade button — only show in price pane, not below it, in the axis, or over a dot-style level\n        const hoveringDotLevel =\n            this.positionRenderStyle === 'dot' && this.hoveredTradeLabel !== null;\n        if (this.tradeButton) {\n            if (\n                isInChartArea &&\n                y >= 0 &&\n                y <= priceH &&\n                !this._isTradingActive &&\n                !hoveringDotLevel\n            ) {\n                this.tradeButton.setY(y);\n                // Hide the + button when it would overlap an off-viewport indicator pill\n                const btnHalfH = this.uiConfig.tradeButton.size / 2;\n                if (overlapsOffViewportPill(y, btnHalfH, this.offViewportHitAreas)) {\n                    this.tradeButton.hide();\n                } else if (this.tfcActive) {\n                    this.tradeButton.show();\n                }\n                this._tradeButtonClickData = { price, y };\n            } else {\n                this.tradeButton.hide();\n            }\n        }\n\n        // Activate pending drag/resize once the mouse moves past the gesture threshold.\n        // This prevents a click-to-pan that happens near a drawing handle from\n        // accidentally putting the drawing into edit mode.\n        if (this._pendingDrawResize) {\n            const dx = x - this._pendingDrawResize.startX;\n            const dy = y - this._pendingDrawResize.startY;\n            if (Math.sqrt(dx * dx + dy * dy) > ChartEngine.DRAW_GESTURE_THRESHOLD) {\n                this.drawingManager.startResize(\n                    this._pendingDrawResize.drawing,\n                    this._pendingDrawResize.pointIndex\n                );\n                this._pendingDrawResize = null;\n            }\n        }\n        if (this._pendingDrawDrag) {\n            const dx = x - this._pendingDrawDrag.startX;\n            const dy = y - this._pendingDrawDrag.startY;\n            if (Math.sqrt(dx * dx + dy * dy) > ChartEngine.DRAW_GESTURE_THRESHOLD) {\n                this.drawingManager.startDrag(\n                    this._pendingDrawDrag.drawing,\n                    this.makeDrawingPoint(rawBarIndex, price)\n                );\n                this._pendingDrawDrag = null;\n            }\n        }\n\n        // Forward raw coords to drawing manager\n        this.drawingManager.onMouseMove(this.makeDrawingPoint(rawBarIndex, price));\n\n        // Axis resize drag\n        if (this.axisDrag) {\n            if (this.axisDrag.axis === 'price') {\n                // Vertical drag on price axis → scale the main price range\n                const delta = y - this.axisDrag.startPos;\n                this.priceScaleFactor = Math.max(\n                    0.1,\n                    Math.min(10, this.axisDrag.startSize * Math.pow(1.005, delta))\n                );\n            } else if (this.axisDrag.axis === 'subpane' && this.axisDrag.indicatorName) {\n                // Vertical drag on sub-pane axis → scale that pane's value range\n                const delta = y - this.axisDrag.startPos;\n                const newFactor = Math.max(\n                    0.1,\n                    Math.min(20, this.axisDrag.startSize * Math.pow(1.005, delta))\n                );\n                this.subPaneScaleFactors.set(this.axisDrag.indicatorName, newFactor);\n            } else {\n                // Horizontal drag on time axis → adjust visible bar count\n                const delta = x - this.axisDrag.startPos; // right = more bars = zoom out\n                const newVisible = Math.max(\n                    10,\n                    Math.min(500, Math.round(this.axisDrag.startSize + delta * 0.5))\n                );\n                const mid = (this.viewport.startIndex + this.viewport.endIndex) / 2;\n                const newStart = Math.max(0, mid - newVisible / 2);\n                this.viewport = {\n                    ...this.viewport,\n                    startIndex: newStart,\n                    endIndex: newStart + newVisible,\n                };\n                this._targetViewport = { ...this.viewport };\n            }\n            this.drawCanvas.style.cursor =\n                this.axisDrag.axis === 'time' ? 'ew-resize' : 'ns-resize';\n            this.scheduleRender();\n            return;\n        }\n\n        // Separator drag\n        if (this.separatorDrag) {\n            const delta = this.separatorDrag.startY - y; // dragging top edge down shrinks the pane\n            const newH = Math.max(40, Math.min(300, this.separatorDrag.startH + delta));\n            this.paneHeightOverrides.set(this.separatorDrag.indicatorName, newH);\n            this.drawCanvas.style.cursor = 'ns-resize';\n            this.scheduleRender();\n            return;\n        }\n\n        // Upgrade a pending trade-level drag to a real drag once the cursor moves past the threshold.\n        // Before the threshold we suppress cursor changes and the drag handler — a subsequent mouseup\n        // without crossing it is treated as a click (see onMouseUp).\n        if (this._pendingTradeDrag) {\n            const dx = x - this._pendingTradeDrag.startX;\n            const dy = y - this._pendingTradeDrag.startY;\n            if (Math.sqrt(dx * dx + dy * dy) > ChartEngine.TRADE_DRAG_PIXEL_THRESHOLD) {\n                const { dragHit, level, hitY } = this._pendingTradeDrag;\n                this._pendingTradeDrag = null;\n                this._startTradeDragFromHit(dragHit, level, hitY);\n                this.drawCanvas.style.cursor = 'ns-resize';\n            } else {\n                return;\n            }\n        }\n\n        // Trade level drag move\n        if (this.tradeDragHandler?.active) {\n            const moveResult = this.tradeDragHandler.onMouseMove(\n                y,\n                this.scaleManager,\n                priceRange,\n                priceH\n            );\n            this.tradeDragNewPrice = moveResult?.newPrice ?? null;\n            this.tradeDragNewSLPrice = moveResult?.derivedSLPrice ?? null;\n            this.tradeDragNewTPPrice = moveResult?.derivedTPPrice ?? null;\n            this.drawCanvas.style.cursor = 'ns-resize';\n            this.renderTradeLayer();\n            // Emit live drag event for external panel sync\n            if (this.tradeDragNewPrice !== null && moveResult) {\n                const colonIdx = moveResult.label.indexOf(':');\n                const baseLabel =\n                    colonIdx !== -1 ? moveResult.label.slice(0, colonIdx) : moveResult.label;\n                const bracketType =\n                    colonIdx !== -1\n                        ? (moveResult.label.slice(colonIdx + 1) as 'stopLoss' | 'takeProfit')\n                        : undefined;\n                const draggingLevel = this.levels.find((l) => l.label === baseLabel);\n                if (draggingLevel) {\n                    this.emitter.emit('tradeLevelDrag', {\n                        label: draggingLevel.label,\n                        newPrice: this.tradeDragNewPrice,\n                        data: draggingLevel.data,\n                        bracketType,\n                        ...(moveResult.derivedSLPrice !== undefined\n                            ? { derivedSLPrice: moveResult.derivedSLPrice }\n                            : {}),\n                        ...(moveResult.derivedTPPrice !== undefined\n                            ? { derivedTPPrice: moveResult.derivedTPPrice }\n                            : {}),\n                        isFullscreen: this.isFullscreen,\n                    });\n                }\n            }\n            return;\n        }\n\n        // Cursor feedback\n        if (!this.drawingManager.getActiveTool()) {\n            // × , ✎, and confirm/cancel buttons always take cursor priority — must run before drag-hover\n            if (\n                hitTestClusterBadge(x, y, this.clusterBadgeAreas) ||\n                hitTestTradeLevelClose(x, y, this.tradeLevelHitAreas) ||\n                hitTestTradeLevelEdit(x, y, this.tradeLevelEditAreas) ||\n                hitTestTradeLevelConfirm(x, y, this.tradeLevelConfirmAreas) ||\n                hitTestOffViewportIndicator(x, y, this.offViewportHitAreas)\n            ) {\n                this.drawCanvas.style.cursor = 'pointer';\n                this.scheduleRender();\n                return;\n            }\n\n            // Trade level drag handle hover — ns-resize cursor.\n            // Also update hovered label here so SL/TP brackets appear while hovering\n            // the draggable line/box, since the drag areas cover the full horizontal\n            // line and box body and would otherwise shadow the hover hit test below.\n            const dragHover = hitTestTradeLevelDrag(x, y, this.tradeLevelDragAreas);\n            if (dragHover) {\n                this.drawCanvas.style.cursor = 'ns-resize';\n                if (dragHover.label !== this.hoveredTradeLabel) {\n                    this.hoveredTradeLabel = dragHover.label;\n                    this.renderTradeLayer();\n                }\n                this.scheduleRender();\n                return;\n            }\n\n            // Trade level hover — update hovered label and repaint trade layer\n            const hoverHit = hitTestTradeLevelHover(x, y, this.tradeHoverAreas);\n            const newHover = hoverHit?.label ?? null;\n            if (newHover !== this.hoveredTradeLabel) {\n                this.hoveredTradeLabel = newHover;\n                this.renderTradeLayer();\n            }\n\n            // Show pointer cursor when hovering a dot-style level\n            if (this.positionRenderStyle === 'dot' && newHover !== null) {\n                this.crosshair = null;\n                this.drawCanvas.style.cursor = 'pointer';\n                this.scheduleRender();\n                return;\n            }\n\n            const seps = this.getSeparatorPositions();\n            const nearSep = seps.find((s) => Math.abs(y - s.y) <= 4);\n            if (nearSep) {\n                this.drawCanvas.style.cursor = 'ns-resize';\n            } else if (x >= chartW) {\n                this.drawCanvas.style.cursor = 'ns-resize';\n            } else if (y >= timeAxisY) {\n                this.drawCanvas.style.cursor = 'ew-resize';\n            } else if (\n                this.drawingManager.isDraggingDrawing() ||\n                this.drawingManager.isResizingDrawing()\n            ) {\n                this.drawCanvas.style.cursor = 'grabbing';\n            } else {\n                const handleHit = this.drawingManager.getHandleAtPoint(\n                    x,\n                    y,\n                    this.scaleManager,\n                    this.viewport,\n                    priceRange,\n                    chartW,\n                    priceH\n                );\n                if (handleHit) {\n                    this.drawCanvas.style.cursor = handleHit.handle.cursor;\n                } else {\n                    const bodyHit = this.drawingManager.hitTest(\n                        x,\n                        y,\n                        this.scaleManager,\n                        this.viewport,\n                        priceRange,\n                        chartW,\n                        priceH\n                    );\n                    this.drawCanvas.style.cursor = bodyHit ? 'move' : 'default';\n                }\n            }\n        }\n\n        this.scheduleRender();\n    };\n\n    private onMouseLeave = (e: MouseEvent): void => {\n        // When cursor moves onto the trade button let button.mouseenter handle crosshair hiding.\n        // Returning early avoids the canvas.mouseleave → canvas.mousemove rapid-toggle flicker.\n        if (this.tradeButton && this.tradeButton.el.contains(e.relatedTarget as Node | null)) {\n            return;\n        }\n        // Synthetic mouseleave fires on mobile after touchend — ignore when crosshair is active.\n        if (this._mobileCrosshairActive) return;\n        this.crosshair = null;\n        if (!this._isTradingActive) {\n            this.tradeButton?.hide();\n        }\n        if (this.hoveredTradeLabel !== null) {\n            this.hoveredTradeLabel = null;\n            this.renderTradeLayer();\n        }\n        this.scheduleRender();\n    };\n\n    private onMouseUp = (): void => {\n        // Click on a draggable level (no movement past threshold) — open edit form,\n        // same payload as the pencil button. This path is what fixes the spurious\n        // Confirm/Cancel that used to appear on any bare box click.\n        if (this._pendingTradeDrag) {\n            const { level } = this._pendingTradeDrag;\n            this._pendingTradeDrag = null;\n            // If the edit form is already open for this level with no staged drags, a repeat\n            // click (on the box, main line, or bracket) toggles it off — mirrors click-outside\n            // deselect. Without this, clicks on the bracket drag area of a level with SL/TP\n            // would silently keep the form open (the guarded _openTradeLevelEditForm is a no-op).\n            if (\n                this._editOpenLabel === level.label &&\n                !this.pendingLevelDrags.has(level.label)\n            ) {\n                this._cancelEditAndDeselect(level.label);\n                return;\n            }\n            this._openTradeLevelEditForm(level);\n            return;\n        }\n        if (this.tradeDragHandler?.active) {\n            const result = this.tradeDragHandler.endDrag();\n            if (result) {\n                this._finalizeMainDragWithBrackets(\n                    result,\n                    this._pendingBracketOrderLabel ?? undefined,\n                );\n            } else {\n                this.tradeDragNewPrice = null;\n            }\n            this._pendingBracketOrderLabel = null;\n            this.drawCanvas.style.cursor = 'default';\n            this.renderTradeLayer();\n            return;\n        }\n        if (this.axisDrag) {\n            const wasPriceAxis = this.axisDrag.axis === 'price' || this.axisDrag.axis === 'time';\n            this.axisDrag = null;\n            this.drawCanvas.style.cursor = 'default';\n            this.scheduleRender();\n            if (wasPriceAxis) this.scheduleViewportPersist();\n        }\n        if (this.separatorDrag) {\n            this.separatorDrag = null;\n            this.drawCanvas.style.cursor = 'default';\n            this.scheduleRender();\n        }\n        // A mouseup without crossing the threshold means it was a plain click — discard pending.\n        this._pendingDrawDrag = null;\n        this._pendingDrawResize = null;\n        if (this.drawingManager.isDraggingDrawing()) {\n            this.drawingManager.endDrag();\n            this.drawCanvas.style.cursor = 'default';\n            this.scheduleRender();\n        }\n        if (this.drawingManager.isResizingDrawing()) {\n            this.drawingManager.endResize();\n            this.drawCanvas.style.cursor = 'default';\n            this.scheduleRender();\n        }\n    };\n\n    private touchToDrawingPoint(touch: Touch): DrawingPoint {\n        const rect = this._cachedDrawRect ?? this.drawCanvas.getBoundingClientRect();\n        const x = touch.clientX - rect.left;\n        const y = touch.clientY - rect.top;\n        const { chartW, priceH } = this.getChartLayout();\n        const priceRange = this._displayedPriceRange ?? this.getScaledPriceRange(this.viewport);\n        return this.makeDrawingPoint(\n            this.scaleManager.pixelToBarIndex(x, this.viewport, chartW),\n            this.scaleManager.pixelToPrice(y, priceRange, priceH)\n        );\n    }\n\n    /**\n     * Builds a fully-populated DrawingPoint from raw float coordinates. Captures\n     * the absolute timestamp at this fractional barIndex so the anchor survives\n     * timeframe changes, data reloads, and serialization round-trips.\n     */\n    private makeDrawingPoint(barIndex: number, price: number): DrawingPoint {\n        const point: DrawingPoint = { barIndex, price };\n        const t = this.barIndexToTimestamp(barIndex);\n        if (t != null) point.timestamp = t;\n        return point;\n    }\n\n    /** Shared close-button handler used by both mouse click and touch tap. */\n    private _handleTradeLevelClose(closedLevel: TradeLevelHitArea): void {\n        if (closedLevel.bracketType) {\n            // Market draft bracket — remove immediately without confirmation\n            const parentLevel = this.levels.find((l) => l.label === closedLevel.label) as\n                | PendingOrderLevel\n                | undefined;\n            const isDraftBracket =\n                (parentLevel?.data as { _isDraft?: boolean } | undefined)?._isDraft === true;\n            if (isDraftBracket && parentLevel) {\n                const bracketKey = closedLevel.bracketType === 'stopLoss' ? 'sl' : 'tp';\n                // Remove the bracket from the draft order and notify the form to toggle off.\n                this.updateDraftOrderBracket(bracketKey, null);\n                this.emitter.emit('tradeLevelEdit', {\n                    label: closedLevel.label,\n                    type: 'pending' as TradeLevelType,\n                    data: parentLevel.data,\n                    isFullscreen: this.isFullscreen,\n                    changes: [\n                        {\n                            field: closedLevel.bracketType === 'stopLoss' ? 'REMOVE_SL' : 'REMOVE_TP',\n                            newPrice: 0,\n                            data: parentLevel.data,\n                            bracketOrderLabel: undefined,\n                        },\n                    ],\n                });\n                return;\n            }\n            // Bracket (SL/TP) removal — stage as pending so user must confirm via ✓/✗\n            const field = closedLevel.bracketType;\n            const existing = this.pendingLevelDrags.get(closedLevel.label) ?? [];\n            const filtered = existing.filter((c) => c.field !== field);\n            filtered.push({\n                field,\n                newPrice: 0,\n                oldPrice: 0,\n                isRemoval: true,\n                bracketOrderLabel: closedLevel.bracketOrderLabel,\n            });\n            this.pendingLevelDrags.set(closedLevel.label, filtered);\n            this.selectedTradeLabel = closedLevel.label;\n            this.renderTradeLayer();\n            return;\n        }\n        // Main level × — close/cancel immediately.\n        // Exception: if the external edit form is open for this level and the only staged\n        // changes (if any) are form-auto-placed brackets (isNew), treat × as \"cancel this\n        // unsaved edit\" rather than closing the trade. Emits tradeLevelEditCancelled so the\n        // form closes; the underlying position/order is left alone.\n        const isDraftOrder = closedLevel.label === this.draftOrderLabel;\n        const pendingBeforeRevert = this.pendingLevelDrags.get(closedLevel.label);\n        const isEditFormOpen = this._editOpenLabel === closedLevel.label;\n        const onlyIsNewPending =\n            !!pendingBeforeRevert &&\n            pendingBeforeRevert.length > 0 &&\n            pendingBeforeRevert.every((c) => c.isNew);\n        const noPending = !pendingBeforeRevert || pendingBeforeRevert.length === 0;\n        const isCancelUnsavedEdit =\n            !isDraftOrder && isEditFormOpen && (onlyIsNewPending || noPending);\n        this.revertPendingChanges(closedLevel.label);\n        this.pendingLevelDrags.delete(closedLevel.label);\n        if (isDraftOrder) return;\n        if (isCancelUnsavedEdit) {\n            // revertPendingChanges only emits + clears _editOpenLabel when it had pending to\n            // revert. For the no-pending case we must do the cancel emission ourselves.\n            if (noPending) {\n                const lvl = this.levels.find((l) => l.label === closedLevel.label);\n                this._editOpenLabel = null;\n                this.selectedTradeLabel = null;\n                this.renderTradeLayer();\n                if (lvl) {\n                    this.emitter.emit('tradeLevelEditCancelled', {\n                        label: closedLevel.label,\n                        type: lvl.type as TradeLevelType,\n                        isFullscreen: this.isFullscreen,\n                    });\n                }\n            }\n            return;\n        }\n        if (this._editOpenLabel === closedLevel.label) this._editOpenLabel = null;\n        const originalLevel = this.levels.find((l) => l.label === closedLevel.label);\n        const isEntryOrder =\n            originalLevel?.type === 'position' &&\n            !!(originalLevel as PositionLevel).entryPriceEditable;\n        const closeAction: 'CLOSED' | 'CANCELLED' =\n            closedLevel.type === 'position' && !isEntryOrder ? 'CLOSED' : 'CANCELLED';\n        this.emitter.emit('tradeLevelClose', {\n            label: closedLevel.label,\n            type: closedLevel.type as TradeLevelType,\n            action: closeAction,\n            data: closedLevel.data,\n            isFullscreen: this.isFullscreen,\n        });\n    }\n\n    /** Activates the mobile crosshair at canvas coords (x, y). */\n    private _activateMobileCrosshair(x: number, y: number): void {\n        const rect = this._cachedDrawRect ?? this.drawCanvas.getBoundingClientRect();\n        const { chartW, priceH } = this.getChartLayout();\n        const priceRange = this._displayedPriceRange ?? this.getScaledPriceRange(this.viewport);\n        const timeAxisY = rect.height - this.timeAxisHeight;\n        if (x >= chartW || y >= timeAxisY) return;\n        this._mobileCrosshairActive = true;\n        const rawBarIndex = this.scaleManager.pixelToBarIndex(x, this.viewport, chartW);\n        const price = this.scaleManager.pixelToPrice(y, priceRange, priceH);\n        const clamped = Math.max(\n            Math.floor(this.viewport.startIndex),\n            Math.min(Math.ceil(this.viewport.endIndex), Math.round(rawBarIndex))\n        );\n        const bar = this.dataStore.all[clamped] ?? null;\n        this.crosshair = this.selectedTradeLabel === null\n            ? { x, y, barIndex: clamped, price, bar }\n            : null;\n        if (this.tradeButton) {\n            this.tradeButton.setY(y);\n            if (this._isTradingActive) {\n                this.tradeButton.hide();\n            } else {\n                const _btnHalfH1 = this.uiConfig.tradeButton.size / 2;\n                if (overlapsOffViewportPill(y, _btnHalfH1, this.offViewportHitAreas)) {\n                    this.tradeButton.hide();\n                } else if (this.tfcActive) {\n                    this.tradeButton.show();\n                }\n            }\n            this._tradeButtonClickData = { price, y };\n        }\n        this.scheduleRender();\n    }\n\n    /**\n     * Closes the edit form, clears selection, and emits `tradeLevelEditCancelled` when\n     * the edit form was actually open for this label. Shared between click-outside,\n     * repeat-click toggle, and the ✗ button so all exit paths produce the same payload.\n     */\n    private _cancelEditAndDeselect(label: string): void {\n        const wasEditFormOpen = this._editOpenLabel === label;\n        const level = this.levels.find((l) => l.label === label);\n        this._editOpenLabel = null;\n        this.selectedTradeLabel = null;\n        this.draftBracketPnl = {};\n        this.renderTradeLayer();\n        if (wasEditFormOpen && level) {\n            this.emitter.emit('tradeLevelEditCancelled', {\n                label,\n                type: level.type as TradeLevelType,\n                isFullscreen: this.isFullscreen,\n            });\n        }\n    }\n\n    /**\n     * Opens the external edit form for a trade level by emitting `tradeLevelEditOpen`.\n     * Shared between pencil click, bare box click, and drag start so every entry\n     * point fires the same payload. No-op when the form is already open for this\n     * label, so repeat opens (e.g. pencil click followed by drag) don't spam the event.\n     */\n    private _openTradeLevelEditForm(level: AnyLevel): void {\n        if (this._editOpenLabel === level.label) return;\n        this.selectedTradeLabel = level.label;\n        this._editOpenLabel = level.label;\n        const { slPrice, tpPrice } = this._resolveBracketPrices(level);\n        this.renderTradeLayer();\n        this.emitter.emit('tradeLevelEditOpen', {\n            label: level.label,\n            type: level.type as TradeLevelType,\n            data: level.data,\n            price: level.price,\n            side: (level as PositionLevel | PendingOrderLevel).side,\n            stopLossPrice: slPrice,\n            takeProfitPrice: tpPrice,\n            isFullscreen: this.isFullscreen,\n        });\n    }\n\n    /** Shared helper: initiate a trade level main-line drag from a hit area. */\n    private _startTradeDragFromHit(dragHit: AnyDragArea, level: AnyLevel, hitY: number): void {\n        if (!this.tradeDragHandler) return;\n        // Compute the level/bracket's current pixel Y using the same priceRange\n        // the last render used, so (dragHit.price, levelPixelY) are a consistent\n        // pair. The pixel offset (hitY - levelPixelY) is what keeps the cursor\n        // locked to the grab point during the drag.\n        const { priceH } = this.getChartLayout();\n        const priceRange = this._displayedPriceRange ?? this.getScaledPriceRange(this.viewport);\n        const levelPixelY = this.scaleManager.yToPixel(dragHit.price, priceRange, priceH);\n        if (dragHit.isBracket) {\n            this._pendingBracketOrderLabel = dragHit.bracketOrderLabel ?? null;\n            this._isBracketNew = false;\n            const isEntryOrder =\n                (level as { entryPriceEditable?: boolean }).entryPriceEditable === true;\n            const isDraft = (level.data as { _isDraft?: boolean } | undefined)?._isDraft === true;\n            // Mobile: pending orders clamp SL/TP against triggered price only.\n            const isMobilePendingOrder =\n                this.hideLevelConfirmCancel && level.type === 'pending' && !isDraft;\n            const all = this.dataStore.all;\n            const marketPrice =\n                isEntryOrder || isDraft || isMobilePendingOrder\n                    ? 0\n                    : (all[all.length - 1]?.close ?? 0);\n            this.tradeDragHandler.startBracketDrag(\n                level,\n                dragHit.bracketType,\n                dragHit.price,\n                hitY,\n                levelPixelY,\n                marketPrice,\n                this._effectiveEntryPrice(level.label, level.price)\n            );\n            this.emitter.emit('tradeLevelDragStart', {\n                label: level.label,\n                bracketType: dragHit.bracketType,\n                isFullscreen: this.isFullscreen,\n            });\n        } else {\n            this._pendingBracketOrderLabel = null;\n            const isEntryOrder = (level as PositionLevel).entryPriceEditable === true;\n            if (isEntryOrder) {\n                this.selectedTradeLabel = dragHit.label;\n                const posLevel = level as PositionLevel;\n                const allPos = this.dataStore.all;\n                const mktPricePos = allPos[allPos.length - 1]?.close ?? 0;\n                // Follow-brackets mode: use the currently displayed SL/TP (staged\n                // pending change wins over stored bracket) as the distance anchor.\n                const effSL = this._effectiveBracketPrice(level.label, 'stopLoss', posLevel.stopLossPrice);\n                const effTP = this._effectiveBracketPrice(level.label, 'takeProfit', posLevel.takeProfitPrice);\n                this.tradeDragHandler.startDrag(\n                    level,\n                    hitY,\n                    levelPixelY,\n                    dragHit.price,\n                    effSL,\n                    effTP,\n                    posLevel.side,\n                    mktPricePos,\n                    posLevel.orderType,\n                    /* followBrackets */ true\n                );\n            } else {\n                const pendingLevel = level as PendingOrderLevel;\n                const allBars = this.dataStore.all;\n                const mktPrice = allBars[allBars.length - 1]?.close ?? 0;\n                // Pending / draft orders also use follow-brackets mode.\n                // For existing pending orders, SL/TP may be stored as separate ToClose sibling\n                // levels rather than inline fields — resolve them before computing effective prices.\n                const { slPrice, tpPrice, slSiblingLabel, tpSiblingLabel } =\n                    this._resolveBracketPrices(level);\n                this._slSiblingOrderLabel = slSiblingLabel ?? null;\n                this._tpSiblingOrderLabel = tpSiblingLabel ?? null;\n                const effSL = this._effectiveBracketPrice(level.label, 'stopLoss', slPrice);\n                const effTP = this._effectiveBracketPrice(level.label, 'takeProfit', tpPrice);\n                this.tradeDragHandler.startDrag(\n                    level,\n                    hitY,\n                    levelPixelY,\n                    dragHit.price,\n                    effSL,\n                    effTP,\n                    pendingLevel.side,\n                    mktPrice,\n                    (pendingLevel as { orderType?: 'limit' | 'stop' | 'market' }).orderType,\n                    /* followBrackets */ true\n                );\n            }\n        }\n        // Drag start also opens the external edit form so the host panel stays in sync\n        // with live price changes (via tradeLevelDrag). For bracket drags this opens the\n        // parent level's form — the parent payload already includes SL/TP. The helper's\n        // internal guard suppresses re-emit when the form is already open for this label.\n        this._openTradeLevelEditForm(level);\n    }\n\n    /** Shared helper: initiate a +SL/+TP add-bracket drag from a hit area. */\n    private _startAddBracketFromHit(addHit: TradeAddBracketArea, hitY: number): void {\n        const level = this.levels.find((l) => l.label === addHit.label);\n        if (!level || !this.tradeDragHandler) return;\n        const { priceH } = this.getChartLayout();\n        const priceRange = this.getScaledPriceRange(this.viewport);\n        const btnCenterY = addHit.y + addHit.h / 2;\n        const initialPrice = this.scaleManager.pixelToPrice(btnCenterY, priceRange, priceH);\n        const isEntryOrder =\n            (level as { entryPriceEditable?: boolean }).entryPriceEditable === true;\n        const isDraft = (level.data as { _isDraft?: boolean } | undefined)?._isDraft === true;\n        // Mobile: pending orders clamp SL/TP against triggered price only.\n        const isMobilePendingOrder =\n            this.hideLevelConfirmCancel && level.type === 'pending' && !isDraft;\n        const all = this.dataStore.all;\n        const marketPrice =\n            isEntryOrder || isDraft || isMobilePendingOrder\n                ? 0\n                : (all[all.length - 1]?.close ?? 0);\n        this._pendingBracketOrderLabel = null;\n        this._isBracketNew = true;\n        this.tradeDragHandler.startBracketDrag(\n            level,\n            addHit.bracketType,\n            initialPrice,\n            hitY,\n            btnCenterY,\n            marketPrice,\n            this._effectiveEntryPrice(level.label, level.price)\n        );\n        this.emitter.emit('tradeLevelDragStart', {\n            label: level.label,\n            bracketType: addHit.bracketType,\n            isFullscreen: this.isFullscreen,\n        });\n    }\n\n    private onDrawingTouchStart = (e: TouchEvent): void => {\n        if (e.touches.length !== 1) return;\n        const touch = e.touches[0];\n        const point = this.touchToDrawingPoint(touch);\n        const activeTool = this.drawingManager.getActiveTool();\n        const placing = this.drawingManager.isPlacing();\n\n        // — Placing a new drawing —\n        if (activeTool !== null || placing) {\n            e.preventDefault();\n            this._lastDrawingTouchPoint = point;\n            if (!placing) {\n                // First tap: place anchor. Suppress touchmove preview until finger lifts.\n                this.drawingManager.onMouseDown(point);\n                this._drawTouchAnchorActive = this.drawingManager.isPlacing();\n            } else {\n                // Subsequent tap: move the preview point to where the user touched.\n                // Actual confirmation happens on touchend so the user can drag to adjust.\n                this._drawTouchAnchorActive = false;\n                this.drawingManager.onMouseMove(point);\n            }\n            this.scheduleRender();\n            return;\n        }\n\n        // — Editing an existing drawing —\n        const rect = this._cachedDrawRect ?? this.drawCanvas.getBoundingClientRect();\n        const x = touch.clientX - rect.left;\n        const y = touch.clientY - rect.top;\n        const { chartW, priceH } = this.getChartLayout();\n        const priceRange = this.getScaledPriceRange(this.viewport);\n\n        // Axis touch drag — must check before drawing hit-tests\n        if (x >= chartW) {\n            e.preventDefault();\n            if (y <= priceH) {\n                this.axisDrag = { axis: 'price', startPos: y, startSize: this.priceScaleFactor };\n            } else {\n                const subPanes = this.activeIndicators\n                    .filter((s) => s.indicator.pane === 'sub')\n                    .map((s) => s.indicator);\n                let paneTop = priceH + PANE_SEPARATOR;\n                for (const ind of subPanes) {\n                    const pH = this.paneH(ind);\n                    if (y >= paneTop && y < paneTop + pH) {\n                        this.axisDrag = {\n                            axis: 'subpane',\n                            startPos: y,\n                            startSize: this.subPaneScaleFactors.get(ind.name) ?? 1,\n                            indicatorName: ind.name,\n                        };\n                        break;\n                    }\n                    paneTop += pH + PANE_SEPARATOR;\n                }\n            }\n            this.scheduleRender();\n            return;\n        }\n        // Time axis touch drag — adjust visible bar count\n        const timeAxisY = rect.height - this.timeAxisHeight;\n        if (y >= timeAxisY) {\n            e.preventDefault();\n            this.axisDrag = {\n                axis: 'time',\n                startPos: x,\n                startSize: this.viewport.endIndex - this.viewport.startIndex,\n            };\n            this.scheduleRender();\n            return;\n        }\n\n        const handleHit = this.drawingManager.getHandleAtPoint(\n            x,\n            y,\n            this.scaleManager,\n            this.viewport,\n            priceRange,\n            chartW,\n            priceH\n        );\n        if (handleHit) {\n            e.preventDefault();\n            this.panHandler.cancel();\n            this.drawingManager.selectDrawing(handleHit.drawing);\n            this.drawingManager.startResize(handleHit.drawing, handleHit.handle.pointIndex);\n            this.hideMobileDrawingFlyout();\n            this.scheduleRender();\n            return;\n        }\n\n        const bodyHit = this.drawingManager.hitTest(\n            x,\n            y,\n            this.scaleManager,\n            this.viewport,\n            priceRange,\n            chartW,\n            priceH\n        );\n        if (bodyHit) {\n            e.preventDefault();\n            this.panHandler.cancel();\n            this.drawingManager.selectDrawing(bodyHit);\n            this.drawingManager.startDrag(bodyHit, point);\n            this._drawTouchStartXY = { x: touch.clientX, y: touch.clientY };\n            this.hideMobileDrawingFlyout();\n            this.scheduleRender();\n            return;\n        }\n\n        // Cluster badge tap — toggle expand/collapse\n        const clusterHitTouch = hitTestClusterBadge(x, y, this.clusterBadgeAreas);\n        if (clusterHitTouch) {\n            e.preventDefault();\n            this.panHandler.cancel();\n            if (this.expandedClusters.has(clusterHitTouch.clusterId)) {\n                this.expandedClusters.delete(clusterHitTouch.clusterId);\n            } else {\n                this.expandedClusters.add(clusterHitTouch.clusterId);\n            }\n            this.renderTradeLayer();\n            return;\n        }\n\n        // Off-viewport level indicator pill — scroll target price to center\n        const offVpHit = hitTestOffViewportIndicator(x, y, this.offViewportHitAreas);\n        if (offVpHit) {\n            e.preventDefault();\n            this.panHandler.cancel();\n            this.scrollToCenterPrice(offVpHit.targetPrice);\n            return;\n        }\n\n        // Trade level confirm/cancel buttons — fire immediately (no drag ambiguity)\n        const confirmHit = hitTestTradeLevelConfirm(x, y, this.tradeLevelConfirmAreas);\n        if (confirmHit) {\n            e.preventDefault();\n            if (confirmHit.action === 'confirm') this.applyPendingChanges(confirmHit.label);\n            else this.revertPendingChanges(confirmHit.label);\n            return;\n        }\n\n        // Draft QTY pill — open inline number input\n        if (this._showQuantityField && this._draftQtyPillArea) {\n            const p = this._draftQtyPillArea;\n            if (x >= p.pillX && x <= p.pillX + p.pillW && y >= p.pillY && y <= p.pillY + p.pillH) {\n                e.preventDefault();\n                e.stopPropagation(); // prevent document mousedown from immediately dismissing the flyout\n                this.openDraftQtyFlyout(p);\n                return;\n            }\n        }\n\n        // Trade level × (close) button — fire immediately\n        const closeHit = hitTestTradeLevelClose(x, y, this.tradeLevelHitAreas);\n        if (closeHit) {\n            e.preventDefault();\n            this._handleTradeLevelClose(closeHit);\n            return;\n        }\n\n        // Trade level edit (pencil) button — notify external panel to open/pre-fill.\n        // MUST be checked before the drag-hit block below: draggable levels (pending\n        // orders, entry-order positions) push a full-width line drag area that fully\n        // covers the pencil's pixels, so checking drag first would swallow every\n        // pencil tap and the emit would never fire.\n        if (!this.drawingManager.getActiveTool()) {\n            const editHit = hitTestTradeLevelEdit(x, y, this.tradeLevelEditAreas);\n            if (editHit) {\n                e.preventDefault();\n                const level = this.levels.find((l) => l.label === editHit.label);\n                if (level) this._openTradeLevelEditForm(level);\n                return;\n            }\n        }\n\n        // Trade level drag handle — start drag on touch\n        if (this.tradeDragHandler && !this.drawingManager.getActiveTool()) {\n            const dragHit = hitTestTradeLevelDrag(x, y, this.tradeLevelDragAreas);\n            if (dragHit) {\n                e.preventDefault();\n                const level = this.levels.find((l) => l.label === dragHit.label);\n                if (level) {\n                    // Mobile mode: non-bracket tap on a level opens the edit panel instead of dragging.\n                    // Box taps (isBox: true) open the panel on first tap, then drag on subsequent taps.\n                    // Exception 1: bracket (SL/TP) taps remain draggable so users can reposition them.\n                    // Exception 2: pending limit/stop levels that are already selected (or are draft\n                    //   orders, which are pre-selected) allow box-tap drag so the price line is\n                    //   repositionable without a separate \"open edit panel\" step first.\n                    const isAlreadySelected = this.selectedTradeLabel === level.label;\n                    const isMobileDraggable =\n                        dragHit.isBracket ||\n                        (level.type === 'pending' &&\n                            (level as PendingOrderLevel).orderType !== 'market' &&\n                            (isAlreadySelected || !(dragHit as TradeLevelDragArea).isBox));\n                    if (this.hideLevelConfirmCancel && !isMobileDraggable) {\n                        const hasPending = this.pendingLevelDrags.has(level.label);\n                        if (this.selectedTradeLabel === level.label && !hasPending) {\n                            this._cancelEditAndDeselect(level.label);\n                            return;\n                        }\n                        this._openTradeLevelEditForm(level);\n                        return;\n                    }\n                    this._startTradeDragFromHit(dragHit, level, y);\n                    this.scheduleRender();\n                    return;\n                }\n            }\n            // +SL / +TP add-bracket button\n            const addHit = hitTestTradeLevelAddBracket(x, y, this.tradeAddBracketAreas);\n            if (addHit) {\n                e.preventDefault();\n                this._startAddBracketFromHit(addHit, y);\n                this.scheduleRender();\n                return;\n            }\n        }\n\n        // Touch: hover-area tap acts as edit trigger. The hover area is larger than\n        // the drag area — it includes the connector region between a fanned\n        // cluster-member box and the actual price line — so this catches edit taps\n        // on expanded-cluster members that would otherwise fall through to the\n        // cluster-collapse branch below. Being inside onDrawingTouchStart already\n        // scopes this to touch input, so no additional mobile flag is needed.\n        if (this.tradeDragHandler && !this.drawingManager.getActiveTool()) {\n            const hoverHit = hitTestTradeLevelHover(x, y, this.tradeHoverAreas);\n            if (hoverHit) {\n                e.preventDefault();\n                const level = this.levels.find((l) => l.label === hoverHit.label);\n                if (level) {\n                    const hasPending = this.pendingLevelDrags.has(hoverHit.label);\n                    if (this.selectedTradeLabel === hoverHit.label && !hasPending) {\n                        this._cancelEditAndDeselect(hoverHit.label);\n                        return;\n                    }\n                    this._openTradeLevelEditForm(level);\n                    return;\n                }\n            }\n        }\n\n        // Tapped empty space — deselect, hide flyout, and collapse expanded clusters\n        this.drawingManager.selectDrawing(null);\n        this.hideMobileDrawingFlyout();\n        if (this.expandedClusters.size > 0) {\n            this.expandedClusters.clear();\n            this.renderTradeLayer();\n        }\n\n        // Mobile crosshair: long-press to show, tap again to dismiss\n        // timeAxisY already declared above (line used for time-axis touch drag check)\n        const isInChartArea = x < chartW && y < timeAxisY;\n        if (isInChartArea) {\n            if (this._mobileCrosshairActive) {\n                // Crosshair already shown — record tap start so touchend can dismiss it\n                if (this._longPressTimer !== null) {\n                    clearTimeout(this._longPressTimer);\n                    this._longPressTimer = null;\n                }\n                this._mobileTapStartXY = { x, y };\n            } else {\n                // Not yet shown — start a long-press timer; activate only on hold\n                if (this._longPressTimer !== null) clearTimeout(this._longPressTimer);\n                this._longPressPoint = { x, y };\n                this._longPressTimer = setTimeout(() => {\n                    this._longPressTimer = null;\n                    if (this._longPressPoint) {\n                        this._activateMobileCrosshair(\n                            this._longPressPoint.x,\n                            this._longPressPoint.y\n                        );\n                        this._longPressPoint = null;\n                    }\n                }, 500);\n            }\n        }\n    };\n\n    private onDrawingTouchMove = (e: TouchEvent): void => {\n        if (e.touches.length !== 1) return;\n        const point = this.touchToDrawingPoint(e.touches[0]);\n        this._lastDrawingTouchPoint = point;\n\n        // Axis drag takes priority — handle price/time scale gestures\n        if (this.axisDrag) {\n            e.preventDefault();\n            const touch = e.touches[0];\n            const rect = this._cachedDrawRect ?? this.drawCanvas.getBoundingClientRect();\n            const tx = touch.clientX - rect.left;\n            const ty = touch.clientY - rect.top;\n            if (this.axisDrag.axis === 'price') {\n                const delta = ty - this.axisDrag.startPos;\n                this.priceScaleFactor = Math.max(\n                    0.1,\n                    Math.min(10, this.axisDrag.startSize * Math.pow(1.005, delta))\n                );\n            } else if (this.axisDrag.axis === 'subpane' && this.axisDrag.indicatorName) {\n                const delta = ty - this.axisDrag.startPos;\n                const newFactor = Math.max(\n                    0.1,\n                    Math.min(20, this.axisDrag.startSize * Math.pow(1.005, delta))\n                );\n                this.subPaneScaleFactors.set(this.axisDrag.indicatorName, newFactor);\n            } else {\n                const delta = tx - this.axisDrag.startPos;\n                const newVisible = Math.max(\n                    10,\n                    Math.min(500, Math.round(this.axisDrag.startSize + delta * 0.5))\n                );\n                const mid = (this.viewport.startIndex + this.viewport.endIndex) / 2;\n                const newStart = Math.max(0, mid - newVisible / 2);\n                this.viewport = {\n                    ...this.viewport,\n                    startIndex: newStart,\n                    endIndex: newStart + newVisible,\n                };\n            }\n            this.scheduleRender();\n            return;\n        }\n\n        // Preview for new drawing placement (skip during first anchor gesture)\n        if (this.drawingManager.isPlacing() && !this._drawTouchAnchorActive) {\n            e.preventDefault();\n            this.drawingManager.onMouseMove(point);\n            this.scheduleRender();\n            return;\n        }\n\n        // Drag or resize an existing drawing\n        if (this.drawingManager.isDraggingDrawing() || this.drawingManager.isResizingDrawing()) {\n            e.preventDefault();\n            e.stopPropagation(); // prevent PanHandler's window-level listener from competing\n            this.drawingManager.onMouseMove(point);\n            this.scheduleRender();\n            return;\n        }\n\n        // Trade level drag — update position\n        if (this.tradeDragHandler?.active) {\n            e.preventDefault();\n            const touch = e.touches[0];\n            const rect = this._cachedDrawRect ?? this.drawCanvas.getBoundingClientRect();\n            const ty = touch.clientY - rect.top;\n            const { priceH } = this.getChartLayout();\n            const priceRange = this._displayedPriceRange ?? this.getScaledPriceRange(this.viewport);\n            const moveResult = this.tradeDragHandler.onMouseMove(\n                ty,\n                this.scaleManager,\n                priceRange,\n                priceH\n            );\n            this.tradeDragNewPrice = moveResult?.newPrice ?? null;\n            this.tradeDragNewSLPrice = moveResult?.derivedSLPrice ?? null;\n            this.tradeDragNewTPPrice = moveResult?.derivedTPPrice ?? null;\n            this.renderTradeLayer();\n            if (this.tradeDragNewPrice !== null && moveResult) {\n                const colonIdx = moveResult.label.indexOf(':');\n                const baseLabel =\n                    colonIdx !== -1 ? moveResult.label.slice(0, colonIdx) : moveResult.label;\n                const bracketType =\n                    colonIdx !== -1\n                        ? (moveResult.label.slice(colonIdx + 1) as 'stopLoss' | 'takeProfit')\n                        : undefined;\n                const draggingLevel = this.levels.find((l) => l.label === baseLabel);\n                if (draggingLevel) {\n                    this.emitter.emit('tradeLevelDrag', {\n                        label: draggingLevel.label,\n                        newPrice: this.tradeDragNewPrice,\n                        data: draggingLevel.data,\n                        bracketType,\n                        ...(moveResult.derivedSLPrice !== undefined\n                            ? { derivedSLPrice: moveResult.derivedSLPrice }\n                            : {}),\n                        ...(moveResult.derivedTPPrice !== undefined\n                            ? { derivedTPPrice: moveResult.derivedTPPrice }\n                            : {}),\n                        isFullscreen: this.isFullscreen,\n                    });\n                }\n            }\n            return;\n        }\n\n        // If a tap was pending but the finger moved far enough, cancel it (let PanHandler pan)\n        // Also cancel the long-press timer on movement — regardless of crosshair state.\n        if (this._mobileTapStartXY || this._longPressTimer !== null) {\n            const touch = e.touches[0];\n            const rect = this._cachedDrawRect ?? this.drawCanvas.getBoundingClientRect();\n            const tapOrigin = this._mobileTapStartXY ?? this._longPressPoint;\n            if (tapOrigin) {\n                const dx = touch.clientX - rect.left - tapOrigin.x;\n                const dy = touch.clientY - rect.top - tapOrigin.y;\n                if (Math.sqrt(dx * dx + dy * dy) > 6) {\n                    this._mobileTapStartXY = null; // dragged — cancel dismiss-tap\n                    if (this._longPressTimer !== null) {\n                        clearTimeout(this._longPressTimer);\n                        this._longPressTimer = null;\n                        this._longPressPoint = null;\n                    }\n                }\n            }\n        }\n\n        // Move mobile crosshair with finger when active\n        if (this._mobileCrosshairActive) {\n            e.preventDefault();\n            const touch = e.touches[0];\n            const rect = this._cachedDrawRect ?? this.drawCanvas.getBoundingClientRect();\n            const x = touch.clientX - rect.left;\n            const y = touch.clientY - rect.top;\n            const { chartW, priceH } = this.getChartLayout();\n            const priceRange = this._displayedPriceRange ?? this.getScaledPriceRange(this.viewport);\n            const timeAxisY = rect.height - this.timeAxisHeight;\n            if (x < chartW && y < timeAxisY) {\n                const rawBarIndex = this.scaleManager.pixelToBarIndex(x, this.viewport, chartW);\n                const price = this.scaleManager.pixelToPrice(y, priceRange, priceH);\n                const clamped = Math.max(\n                    Math.floor(this.viewport.startIndex),\n                    Math.min(Math.ceil(this.viewport.endIndex), Math.round(rawBarIndex))\n                );\n                const bar = this.dataStore.all[clamped] ?? null;\n                this.crosshair = this.selectedTradeLabel === null\n                    ? { x, y, barIndex: clamped, price, bar }\n                    : null;\n                if (this.tradeButton) {\n                    this.tradeButton.setY(y);\n                    if (this._isTradingActive) {\n                        this.tradeButton.hide();\n                    } else {\n                        const _btnHalfH2 = this.uiConfig.tradeButton.size / 2;\n                        if (overlapsOffViewportPill(y, _btnHalfH2, this.offViewportHitAreas)) {\n                            this.tradeButton.hide();\n                        } else if (this.tfcActive) {\n                            this.tradeButton.show();\n                        }\n                    }\n                    this._tradeButtonClickData = { price, y };\n                }\n                this.scheduleRender();\n            }\n        }\n    };\n\n    private onDrawingTouchEnd = (_e: TouchEvent): void => {\n        this._lastTouchTime = Date.now();\n        // Always clear long-press timer on finger lift (short tap = no activation)\n        if (this._longPressTimer !== null) {\n            clearTimeout(this._longPressTimer);\n            this._longPressTimer = null;\n            this._longPressPoint = null;\n        }\n\n        // Trade level drag — finalise\n        if (this.tradeDragHandler?.active) {\n            const result = this.tradeDragHandler.endDrag();\n            if (result) {\n                this._finalizeMainDragWithBrackets(\n                    result,\n                    this._pendingBracketOrderLabel ?? undefined,\n                );\n            } else {\n                this.tradeDragNewPrice = null;\n            }\n            this._pendingBracketOrderLabel = null;\n            this.renderTradeLayer();\n            return;\n        }\n\n        if (this.axisDrag) {\n            const wasPriceAxis = this.axisDrag.axis === 'price' || this.axisDrag.axis === 'time';\n            this.axisDrag = null;\n            this.scheduleRender();\n            if (wasPriceAxis) this.scheduleViewportPersist();\n            return;\n        }\n\n        const wasAnchorTouch = this._drawTouchAnchorActive;\n        this._drawTouchAnchorActive = false;\n\n        // Confirm point placement for 2nd+ gestures (touchend = confirm, not touchstart)\n        if (!wasAnchorTouch && this.drawingManager.isPlacing() && this._lastDrawingTouchPoint) {\n            this.drawingManager.onMouseDown(this._lastDrawingTouchPoint);\n            this._lastDrawingTouchPoint = null;\n            this.scheduleRender();\n            return;\n        }\n\n        // End drag / resize of existing drawings\n        if (this.drawingManager.isDraggingDrawing()) {\n            const endTouch = _e.changedTouches[0];\n            const startXY = this._drawTouchStartXY;\n            this._drawTouchStartXY = null;\n            this.drawingManager.endDrag();\n\n            // If it was a tap (no significant movement) and a drawing is selected → show flyout\n            if (endTouch && startXY && this.drawingManager.getSelectedDrawing()) {\n                const dx = endTouch.clientX - startXY.x;\n                const dy = endTouch.clientY - startXY.y;\n                if (Math.sqrt(dx * dx + dy * dy) < 8) {\n                    this.showMobileDrawingFlyout(endTouch.clientX, endTouch.clientY);\n                }\n            }\n            this.scheduleRender();\n        }\n        if (this.drawingManager.isResizingDrawing()) {\n            this.drawingManager.endResize();\n            this.scheduleRender();\n        }\n\n        // Mobile tap commit — dismiss crosshair when crosshair was active on touchstart\n        // (_mobileTapStartXY is only set when crosshair is already active; cleared on drag)\n        if (this._mobileTapStartXY) {\n            this._mobileTapStartXY = null;\n            // Dismiss crosshair on tap\n            this._mobileCrosshairActive = false;\n            this.crosshair = null;\n            this.tradeButton?.hide();\n            this.scheduleRender();\n        }\n    };\n\n    private onCanvasClick = (e: MouseEvent): void => {\n        const rect = this._cachedDrawRect ?? this.drawCanvas.getBoundingClientRect();\n        const x = e.clientX - rect.left;\n        const y = e.clientY - rect.top;\n\n        const { chartW, priceH } = this.getChartLayout();\n        const priceRange = this._displayedPriceRange ?? this.getScaledPriceRange(this.viewport);\n\n        const rawBarIndex = this.scaleManager.pixelToBarIndex(x, this.viewport, chartW);\n        const price = this.scaleManager.pixelToPrice(y, priceRange, priceH);\n        const barIndex = Math.round(rawBarIndex);\n\n        // Cluster badge click — toggle expand/collapse\n        const clusterHit = hitTestClusterBadge(x, y, this.clusterBadgeAreas);\n        if (clusterHit) {\n            if (this.expandedClusters.has(clusterHit.clusterId)) {\n                this.expandedClusters.delete(clusterHit.clusterId);\n            } else {\n                this.expandedClusters.add(clusterHit.clusterId);\n            }\n            this.renderTradeLayer();\n            return;\n        }\n\n        // Off-viewport level indicator pill — scroll target price to center\n        const offVpHit = hitTestOffViewportIndicator(x, y, this.offViewportHitAreas);\n        if (offVpHit) {\n            this.scrollToCenterPrice(offVpHit.targetPrice);\n            return;\n        }\n\n        // Trade level inline confirm/cancel buttons — check first\n        const confirmHit = hitTestTradeLevelConfirm(x, y, this.tradeLevelConfirmAreas);\n        if (confirmHit) {\n            if (confirmHit.action === 'confirm') this.applyPendingChanges(confirmHit.label);\n            else this.revertPendingChanges(confirmHit.label);\n            return;\n        }\n\n        // Draft QTY pill — open inline number input\n        if (this._showQuantityField && this._draftQtyPillArea) {\n            const p = this._draftQtyPillArea;\n            if (x >= p.pillX && x <= p.pillX + p.pillW && y >= p.pillY && y <= p.pillY + p.pillH) {\n                e.preventDefault();\n                e.stopPropagation(); // prevent document mousedown from immediately dismissing the flyout\n                this.openDraftQtyFlyout(p);\n                return;\n            }\n        }\n\n        // Trade/position × button — check before axis/drawing handlers\n        const closedLevel = hitTestTradeLevelClose(x, y, this.tradeLevelHitAreas);\n        if (closedLevel) {\n            this._handleTradeLevelClose(closedLevel);\n            return;\n        }\n\n        // Trade level edit (pencil) button — notify external panel to open/pre-fill.\n        // MUST be checked before the drag-hit block below: draggable levels (pending orders,\n        // entry-order positions) push a full-width line drag area that fully covers the\n        // pencil's pixels, so checking drag first would swallow every pencil click and the\n        // emit would never fire.\n        if (!this.drawingManager.getActiveTool()) {\n            const editHit = hitTestTradeLevelEdit(x, y, this.tradeLevelEditAreas);\n            if (editHit) {\n                const level = this.levels.find((l) => l.label === editHit.label);\n                if (level) this._openTradeLevelEditForm(level);\n                return;\n            }\n        }\n\n        // +SL / +TP add-bracket button — starts a new bracket drag from the button position\n        if (this.tradeDragHandler && !this.drawingManager.getActiveTool()) {\n            const addHit = hitTestTradeLevelAddBracket(x, y, this.tradeAddBracketAreas);\n            if (addHit) {\n                this._startAddBracketFromHit(addHit, y);\n                this.drawCanvas.style.cursor = 'ns-resize';\n                return;\n            }\n        }\n\n        // Trade level drag handle — check before axis/drawing handlers.\n        // Defer the real drag start: stash as pending and only upgrade to an actual\n        // drag once the mouse moves past TRADE_DRAG_PIXEL_THRESHOLD. A mouseup without\n        // movement means it was a click — handled in onMouseUp by opening the edit form\n        // (same behavior as the pencil button).\n        if (this.tradeDragHandler && !this.drawingManager.getActiveTool()) {\n            const dragHit = hitTestTradeLevelDrag(x, y, this.tradeLevelDragAreas);\n            if (dragHit) {\n                const level = this.levels.find((l) => l.label === dragHit.label);\n                if (level) {\n                    // Mobile mode: skip drag start for non-bracket taps; hover-hit path below handles it\n                    if (!(this.hideLevelConfirmCancel && !dragHit.isBracket)) {\n                        this._pendingTradeDrag = { dragHit, level, hitY: y, startX: x, startY: y };\n                        return;\n                    }\n                }\n            }\n        }\n\n        // Trade level hover — click to select (shows SL/TP brackets and enters edit mode).\n        // Non-draggable levels (open positions, plain trades) route through here because they\n        // don't push a drag area. The edit form is opened on desktop too so SL/TP editing is\n        // reachable for positions without SL/TP — otherwise the level would just go \"active\"\n        // with no way to invoke the host's edit form.\n        const hoverHit = hitTestTradeLevelHover(x, y, this.tradeHoverAreas);\n        if (hoverHit) {\n            const hasPending = this.pendingLevelDrags.has(hoverHit.label);\n            // Toggle off if already selected + no staged pending work (pending protects work-in-progress)\n            if (this.selectedTradeLabel === hoverHit.label && !hasPending) {\n                this._cancelEditAndDeselect(hoverHit.label);\n                return;\n            }\n            const level = this.levels.find((l) => l.label === hoverHit.label);\n            if (level) {\n                this._openTradeLevelEditForm(level);\n            } else {\n                this.selectedTradeLabel = hoverHit.label;\n                this.renderTradeLayer();\n            }\n            return;\n        } else if (this.selectedTradeLabel !== null) {\n            // In mobile mode (hideLevelConfirmCancel) a level is opened/closed by tapping on it\n            // directly — tapping elsewhere on the canvas (e.g. to start a bracket drag) must NOT\n            // dismiss it. Also gated by `deselectActiveOnOutsideClick` (default false) so\n            // incidental clicks (price-axis resize, taps outside the QTY input) don't drop an\n            // in-progress edit.\n            if (!this.hideLevelConfirmCancel && this.deselectActiveOnOutsideClick) {\n                const lbl = this.selectedTradeLabel;\n                const pending = this.pendingLevelDrags.get(lbl);\n                if (!pending || pending.length === 0) {\n                    // Handles both the \"edit form open\" and the plain \"selected without form\"\n                    // cases: the helper is a no-emit clear when no form was open for this label.\n                    this._cancelEditAndDeselect(lbl);\n                } else {\n                    // Outside click reverts any staged changes (drags, form-initiated edits, or\n                    // auto-placed brackets) — mirrors the ✗ cancel button. Users have explicit\n                    // ✓/✗ to commit; outside click always means cancel so the behavior is the\n                    // same regardless of whether the pending work came from a drag or from the\n                    // external form updating an existing SL/TP.\n                    this.revertPendingChanges(lbl);\n                }\n            }\n        }\n\n        // Clicked outside any trade level — collapse expanded clusters\n        if (this.expandedClusters.size > 0) {\n            this.expandedClusters.clear();\n            this.renderTradeLayer();\n        }\n\n        // Axis resize — takes priority over everything\n        const timeAxisY = rect.height - this.timeAxisHeight;\n        if (x >= chartW) {\n            if (y <= priceH) {\n                // Main pane price axis: vertical drag scales the main price range\n                this.axisDrag = { axis: 'price', startPos: y, startSize: this.priceScaleFactor };\n            } else {\n                // Sub-pane axis: find which sub-pane and scale its range independently\n                const subPanes = this.activeIndicators\n                    .filter((s) => s.indicator.pane === 'sub')\n                    .map((s) => s.indicator);\n                let paneTop = priceH + PANE_SEPARATOR;\n                for (const ind of subPanes) {\n                    const pH = this.paneH(ind);\n                    if (y >= paneTop && y < paneTop + pH) {\n                        this.axisDrag = {\n                            axis: 'subpane',\n                            startPos: y,\n                            startSize: this.subPaneScaleFactors.get(ind.name) ?? 1,\n                            indicatorName: ind.name,\n                        };\n                        break;\n                    }\n                    paneTop += pH + PANE_SEPARATOR;\n                }\n            }\n            this.scheduleRender();\n            return;\n        }\n        if (y >= timeAxisY) {\n            // Time axis zone: horizontal drag adjusts visible bar count\n            this.axisDrag = {\n                axis: 'time',\n                startPos: x,\n                startSize: this.viewport.endIndex - this.viewport.startIndex,\n            };\n            this.scheduleRender();\n            return;\n        }\n\n        // Separator resize — takes priority over everything\n        const seps = this.getSeparatorPositions();\n        const nearSep = seps.find((s) => Math.abs(y - s.y) <= 4);\n        if (nearSep) {\n            const ind = this.indicators.find((i) => i.name === nearSep.indicatorName);\n            const currentH =\n                this.paneHeightOverrides.get(nearSep.indicatorName) ??\n                ind?.paneHeight ??\n                SUB_PANE_HEIGHT;\n            this.separatorDrag = {\n                indicatorName: nearSep.indicatorName,\n                startY: y,\n                startH: currentH,\n            };\n            this.scheduleRender();\n            return;\n        }\n\n        // Pass raw coords to drawing — pixel-perfect placement\n        const consumed = this.drawingManager.onMouseDown(\n            this.makeDrawingPoint(rawBarIndex, price)\n        );\n\n        if (!consumed) {\n            // Check handle first (resize), then body (drag).\n            // Do NOT call startResize/startDrag immediately — defer until the mouse moves past\n            // DRAW_GESTURE_THRESHOLD so that a click-to-pan that happens near a drawing handle\n            // doesn't accidentally put the drawing into edit mode.\n            const handleHit = this.drawingManager.getHandleAtPoint(\n                x,\n                y,\n                this.scaleManager,\n                this.viewport,\n                priceRange,\n                chartW,\n                priceH\n            );\n            if (handleHit) {\n                this.drawingManager.selectDrawing(handleHit.drawing);\n                this._pendingDrawResize = {\n                    drawing: handleHit.drawing,\n                    pointIndex: handleHit.handle.pointIndex,\n                    startX: x,\n                    startY: y,\n                };\n            } else {\n                const bodyHit = this.drawingManager.hitTest(\n                    x,\n                    y,\n                    this.scaleManager,\n                    this.viewport,\n                    priceRange,\n                    chartW,\n                    priceH\n                );\n                this.drawingManager.selectDrawing(bodyHit);\n                if (bodyHit) {\n                    this._pendingDrawDrag = { drawing: bodyHit, startX: x, startY: y };\n                }\n            }\n\n            const bar = this.dataStore.all[barIndex] ?? null;\n            this.emitter.emit('click', { x, y, barIndex, price, bar });\n        }\n\n        this.scheduleRender();\n    };\n\n    private onDoubleClick = (e: MouseEvent): void => {\n        this.drawingManager.finalizePlacing();\n\n        const rect = this._cachedDrawRect ?? this.drawCanvas.getBoundingClientRect();\n        const x = e.clientX - rect.left;\n        const y = e.clientY - rect.top;\n        const { chartW, priceH } = this.getChartLayout();\n        const timeAxisY = rect.height - this.timeAxisHeight;\n\n        if (x >= chartW) {\n            // Double-click on price axis → reset Y\n            this.resetPriceAxis();\n            return;\n        }\n        if (y >= timeAxisY) {\n            // Double-click on time axis → reset X\n            this.resetTimeAxis();\n            return;\n        }\n\n        // Double-click on a text drawing → open text editor\n        const TEXT_TYPES = new Set(['text', 'callout', 'anchoredNote']);\n        const selected = this.drawingManager.getSelectedDrawing();\n        if (selected && TEXT_TYPES.has(selected.type)) {\n            const priceRange = this.getScaledPriceRange(this.viewport);\n            if (\n                selected.hitTest(x, y, this.scaleManager, this.viewport, priceRange, chartW, priceH)\n            ) {\n                this.showTextInput(selected);\n                return;\n            }\n        }\n\n        this.scheduleRender();\n    };\n\n    private onKeyDown = (e: KeyboardEvent): void => {\n        // Collapse all expanded level clusters on Escape\n        if (e.key === 'Escape' && this.expandedClusters.size > 0) {\n            this.expandedClusters.clear();\n            this.renderTradeLayer();\n            e.preventDefault();\n            return;\n        }\n        if (e.key === 'Escape' && this.pendingLevelDrags.size > 0) {\n            this.revertPendingChanges();\n            e.preventDefault();\n            return;\n        }\n        const ctrlZ = (e.ctrlKey || e.metaKey) && e.key === 'z';\n        const key = ctrlZ ? 'z' : e.key;\n        const consumed = this.drawingManager.onKeyDown(key);\n        if (consumed) {\n            e.preventDefault();\n            this.hideMobileDrawingFlyout();\n            // Sync left bar active state after Escape\n            this.leftBar?.setActiveTool(this.drawingManager.getActiveTool());\n            this.drawCanvas.style.cursor = this.drawingManager.getActiveTool()\n                ? 'crosshair'\n                : 'default';\n            this.scheduleRender();\n        }\n    };\n\n    // ── Text drawing input ────────────────────────────────────────────────────\n\n    private showTextInput(drawing: import('./core/types.js').IDrawing): void {\n        if (!this.textInputEl) return;\n        this.textInputDrawing = drawing;\n\n        const { chartW, priceH } = this.getChartLayout();\n        const priceRange = this.getScaledPriceRange(this.viewport);\n\n        // Compute anchor pixel position relative to canvasWrap\n        let px: number;\n        let py: number;\n        if (drawing.type === 'text') {\n            px = this.scaleManager.xToPixel(drawing.points[0].barIndex, this.viewport, chartW);\n            py = this.scaleManager.yToPixel(drawing.points[0].price, priceRange, priceH);\n        } else {\n            // callout / anchoredNote — use p2 (the box/badge position)\n            const p = drawing.points[1] ?? drawing.points[0];\n            px = this.scaleManager.xToPixel(p.barIndex, this.viewport, chartW) - 30;\n            py = this.scaleManager.yToPixel(p.price, priceRange, priceH) - 10;\n        }\n\n        const el = this.textInputEl;\n        el.value = drawing.text ?? '';\n        el.style.left = `${Math.max(0, px)}px`;\n        el.style.top = `${Math.max(0, py)}px`;\n        el.style.display = 'block';\n\n        this.drawingManager.setEditingText(true);\n        el.focus();\n        el.select();\n\n        const commit = () => {\n            el.removeEventListener('keydown', onKey);\n            el.removeEventListener('blur', onBlur);\n            this.commitTextInput();\n        };\n        const cancel = () => {\n            el.removeEventListener('keydown', onKey);\n            el.removeEventListener('blur', onBlur);\n            this.cancelTextInput();\n        };\n        const onKey = (ev: KeyboardEvent) => {\n            if (ev.key === 'Enter') {\n                ev.preventDefault();\n                commit();\n            } else if (ev.key === 'Escape') {\n                ev.preventDefault();\n                cancel();\n            }\n        };\n        const onBlur = () => commit();\n        el.addEventListener('keydown', onKey);\n        el.addEventListener('blur', onBlur, { once: true });\n    }\n\n    private commitTextInput(): void {\n        if (!this.textInputEl || !this.textInputDrawing) return;\n        this.textInputDrawing.text = this.textInputEl.value;\n        this.textInputEl.style.display = 'none';\n        this.textInputDrawing = null;\n        this.drawingManager.setEditingText(false);\n        this.drawingManager.onDrawingsChange?.();\n        this.scheduleRender();\n    }\n\n    private cancelTextInput(): void {\n        if (!this.textInputEl) return;\n        this.textInputEl.style.display = 'none';\n        this.textInputDrawing = null;\n        this.drawingManager.setEditingText(false);\n        this.scheduleRender();\n    }\n\n    private setDotTickActive(): void {\n        if (!this.siStreamDot) return;\n        if (this.tickActivityTimer !== null) clearTimeout(this.tickActivityTimer);\n        this.siStreamDot.style.background = this.theme.candle.up;\n        this.tickActivityTimer = setTimeout(() => {\n            this.tickActivityTimer = null;\n            if (this.siStreamDot)\n                this.siStreamDot.style.background = this.theme.ui.stream[this.streamStatus];\n        }, this.tickActivityMs);\n    }\n\n    private onTick = (tick: Tick): void => {\n        if (this._isDestroyed) return;\n        const all = this.dataStore.all;\n        if (all.length === 0) return;\n        // Drop ticks that arrive during an in-flight data fetch — they carry prices\n        // from the old symbol/timeframe and would corrupt the incoming bars.\n        if (this._suppressTicks) return;\n\n        this.liveBidAsk = { bid: tick.bid, ask: tick.ask };\n        this.setDotTickActive();\n\n        const last = all[all.length - 1];\n        const intervalMs = this.timeframeToMs(this.timeframe);\n\n        const tickPrice = this.tickClosePriceSource === 'ask' ? tick.ask : tick.bid;\n\n        if (tick.time < last.time + intervalMs) {\n            // Update current bar using configured price source\n            const updated: OHLCVBar = {\n                ...last,\n                high: Math.max(last.high, tickPrice),\n                low: Math.min(last.low, tickPrice),\n                close: tickPrice,\n                volume: (last.volume ?? 0) + tick.volume,\n            };\n            all[all.length - 1] = updated;\n        } else {\n            // Capture before push so references stay correct\n            const completedBar = last;\n            // Snap new bar to the actual period boundary of the incoming tick,\n            // skipping any gap (overnight, weekend, missing bars) in one step.\n            const newBarTime = Math.floor(tick.time / intervalMs) * intervalMs;\n            all.push({\n                time: newBarTime,\n                open: tickPrice,\n                high: tickPrice,\n                low: tickPrice,\n                close: tickPrice,\n                volume: tick.volume,\n            });\n            if (this._debug) {\n                /* eslint-disable-next-line no-console */\n                console.warn(\n                    `[tick] → NEW candle @ ${new Date(newBarTime).toISOString()}` +\n                        ` (closed ${new Date(completedBar.time).toISOString()})` +\n                        ` | total bars=${all.length}`\n                );\n            }\n            const openingBar = all[all.length - 1];\n            // Advance viewport if user is tracking the live edge (has lookahead space)\n            if (this._targetViewport.endIndex >= all.length) {\n                this._targetViewport = {\n                    ...this._targetViewport,\n                    startIndex: this._targetViewport.startIndex + 1,\n                    endIndex: this._targetViewport.endIndex + 1,\n                };\n            }\n            this.emitter.emit('newBar', { completedBar, openingBar, intervalMs });\n            // Re-fetch the completed candle (+ 2 neighbours) to correct tick-reconstructed OHLCV\n            this.correctCompletedBar(completedBar.time, intervalMs);\n            // If the new bar is more than one interval ahead of the last bar, there are missing\n            // bars (e.g. system clock was behind feed time during initial load) — backfill them.\n            // Start from completedBar.time (not +intervalMs) so the last loaded bar is also\n            // re-fetched and corrected — it may have been captured mid-candle at load time.\n            if (newBarTime > completedBar.time + intervalMs) {\n                this.fillTickGap(completedBar.time, newBarTime);\n            }\n        }\n\n        this.recomputeIndicators();\n        this.scheduleRender();\n    };\n\n    /** Fetch bars that fall in a gap between the last historical bar and the first live bar.\n     *  This happens when the system clock was behind feed time during the initial data load. */\n    private fillTickGap(fromTime: number, toTime: number): void {\n        if (!this.dataLoader) return;\n        if (this.isFetching) return;\n        const interval = this.timeframeToInterval(this.getBaseInterval());\n        this.dataLoader({ start: new Date(fromTime), end: new Date(toTime), interval })\n            .then((rawBars) => {\n                const bars = this.maybeAggregate(rawBars);\n                if (bars.length === 0) return;\n                // Freeze timestamps on any legacy drawing points before splicing\n                // bars. After splice, barIndex references are stale, so reanchor\n                // from timestamps to recompute each point's correct position.\n                this.backfillDrawingTimestamps();\n                const all = this.dataStore.all;\n                const liveBar = all[all.length - 1];\n                let insertCount = 0;\n                for (const bar of bars) {\n                    if (bar.time >= liveBar.time) continue;\n                    const existingIdx = all.findIndex((b) => b.time === bar.time);\n                    if (existingIdx !== -1) {\n                        // Replace — corrects bars that were captured mid-candle at load time\n                        all[existingIdx] = bar;\n                    } else {\n                        const insertAt = all.findIndex((b) => b.time > bar.time);\n                        all.splice(insertAt === -1 ? all.length - 1 : insertAt, 0, bar);\n                        insertCount++;\n                    }\n                }\n                if (insertCount > 0) {\n                    this.viewport = {\n                        ...this.viewport,\n                        startIndex: this.viewport.startIndex + insertCount,\n                        endIndex: this.viewport.endIndex + insertCount,\n                    };\n                    this.reanchorDrawingsByTimestamp();\n                    this.recomputeIndicators();\n                    this.scheduleRender();\n                }\n            })\n            .catch(() => {\n                /* silently ignore */\n            });\n    }\n\n    /** Re-fetch the just-closed candle (plus 2 neighbours) via `dataLoader` to replace\n     *  tick-reconstructed OHLCV with authoritative exchange data. No-op if no loader. */\n    private correctCompletedBar(barTime: number, intervalMs: number): void {\n        if (!this.dataLoader) return;\n        if (this.isFetching) return;\n        const start = new Date(barTime);\n        const end = new Date(barTime + intervalMs * 3);\n        const interval = this.timeframeToInterval(this.getBaseInterval());\n        this.dataLoader({ start, end, interval })\n            .then((rawBars) => {\n                const bars = this.maybeAggregate(rawBars);\n                if (bars.length === 0) return;\n                const all = this.dataStore.all;\n                const liveBarIndex = all.length - 1;\n                let changed = false;\n                for (const bar of bars) {\n                    const idx = all.findIndex((b) => b.time === bar.time);\n                    if (idx !== -1 && idx !== liveBarIndex) {\n                        all[idx] = bar;\n                        changed = true;\n                    }\n                }\n                if (changed) {\n                    this.recomputeIndicators();\n                    this.scheduleRender();\n                }\n            })\n            .catch(() => {\n                /* silently ignore fetch errors — tick data remains */\n            });\n    }\n\n    /** Enable or disable verbose tick logging to the console for debugging live candle issues. */\n    public setDebug(enabled: boolean): this {\n        this._debug = enabled;\n        return this;\n    }\n\n    /** Replace the bar with the given timestamp with authoritative OHLCV data.\n     *  Use this when you receive a corrected candle from an external source. */\n    public correctBar(barTime: number, bar: OHLCVBar): void {\n        const all = this.dataStore.all;\n        const idx = all.findIndex((b) => b.time === barTime);\n        if (idx === -1) return;\n        all[idx] = bar;\n        this.recomputeIndicators();\n        this.scheduleRender();\n    }\n\n    private scrollToEnd(): void {\n        this.panHandler.cancel();\n        if (this.scrollAnimId !== null) {\n            cancelAnimationFrame(this.scrollAnimId);\n            this.scrollAnimId = null;\n        }\n\n        const visible = this.viewport.endIndex - this.viewport.startIndex;\n        const targetEnd = this.dataStore.length + LOOKAHEAD;\n        const startEnd = this.viewport.endIndex;\n        const startPan = this.pricePanOffset;\n        const DURATION = 350; // ms\n        const t0 = performance.now();\n\n        const ease = (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t); // ease-in-out quad\n\n        const step = (now: number) => {\n            const raw = Math.min((now - t0) / DURATION, 1);\n            const prog = ease(raw);\n\n            const newEnd = startEnd + (targetEnd - startEnd) * prog;\n            this.viewport = {\n                ...this.viewport,\n                startIndex: newEnd - visible,\n                endIndex: newEnd,\n            };\n            // Keep _targetViewport in sync so the render-loop lerp doesn't fight this animation\n            this._targetViewport = { ...this.viewport };\n            this.pricePanOffset = startPan * (1 - prog);\n            this.render();\n\n            if (raw < 1) {\n                this.scrollAnimId = requestAnimationFrame(step);\n            } else {\n                this.scrollAnimId = null;\n            }\n        };\n\n        this.scrollAnimId = requestAnimationFrame(step);\n    }\n\n    /**\n     * Smooth-scroll the Y axis so `price` lands at the vertical center of the\n     * chart. Animates `pricePanOffset` only — horizontal viewport is preserved.\n     * Used by off-viewport level indicator clicks.\n     */\n    private scrollToCenterPrice(price: number): void {\n        if (!isFinite(price) || this.dataStore.length === 0) return;\n        if (this.scrollAnimId !== null) {\n            cancelAnimationFrame(this.scrollAnimId);\n            this.scrollAnimId = null;\n        }\n\n        const base = this.dataStore.getPriceRange(this.viewport);\n        const naturalMid = (base.min + base.max) / 2;\n        const startPan = this.pricePanOffset;\n        const targetPan = price - naturalMid;\n        if (Math.abs(targetPan - startPan) < 1e-9) return;\n\n        const DURATION = 350;\n        const t0 = performance.now();\n        const ease = (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t);\n\n        const step = (now: number) => {\n            const raw = Math.min((now - t0) / DURATION, 1);\n            const prog = ease(raw);\n            this.pricePanOffset = startPan + (targetPan - startPan) * prog;\n            this.render();\n            if (raw < 1) {\n                this.scrollAnimId = requestAnimationFrame(step);\n            } else {\n                this.scrollAnimId = null;\n            }\n        };\n        this.scrollAnimId = requestAnimationFrame(step);\n    }\n\n    private resetPriceAxis(): void {\n        this.priceScaleFactor = 1.0;\n        this.pricePanOffset = 0;\n        this._lockedAutoFitBase = null;\n        this.scheduleRender();\n    }\n\n    private resetTimeAxis(): void {\n        this.panHandler.cancel();\n        const total = this.dataStore.length;\n        if (total === 0) return;\n        const resetVisibleBars = initialVisibleBars(\n            this.mobileBarDivisor,\n            this.explicitMobileDivisor,\n            this.defaultVisibleBars,\n            this.defaultMobileVisibleBars\n        );\n        this._defaultVisibleBars = resetVisibleBars;\n        const newStart = Math.max(0, total - resetVisibleBars + LOOKAHEAD);\n        this.viewport = { ...this.viewport, startIndex: newStart, endIndex: total + LOOKAHEAD };\n        this._targetViewport = { ...this.viewport };\n        this.scheduleRender();\n    }\n\n    /** Reset both price and time axes to their default state. */\n    resetView(): void {\n        this.resetPriceAxis();\n        this.resetTimeAxis();\n    }\n\n    private applyResetViewBtnStyles(): void {\n        if (!this.resetViewBtn) return;\n        this.resetViewBtn.innerHTML = iconResetView(this.theme.axisText, 16);\n        Object.assign(this.resetViewBtn.style, {\n            position: 'absolute',\n            bottom: `${this.timeAxisHeight + 8}px`,\n            left: '50%',\n            transform: 'translateX(-50%)',\n            zIndex: '100',\n            width: '32px',\n            height: '32px',\n            padding: '0',\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n            backgroundColor: this.theme.background,\n            border: `1px solid ${this.theme.axisBorder}`,\n            borderRadius: '50%',\n            cursor: 'pointer',\n            outline: 'none',\n            boxShadow: '0 2px 6px rgba(0,0,0,0.25)',\n            opacity: '0',\n            pointerEvents: 'none',\n            transition: 'opacity 0.2s ease',\n        });\n    }\n\n    private applyScrollToEndBtnStyles(): void {\n        if (!this.scrollToEndBtn) return;\n        this.scrollToEndBtn.innerHTML = iconScrollToEnd(this.theme.axisText, 16);\n        Object.assign(this.scrollToEndBtn.style, {\n            position: 'absolute',\n            bottom: `${this.timeAxisHeight + 8}px`,\n            right: `${this.priceAxisWidth + 8}px`,\n            zIndex: '100',\n            width: '32px',\n            height: '32px',\n            padding: '0',\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n            backgroundColor: this.theme.background,\n            border: `1px solid ${this.theme.axisBorder}`,\n            borderRadius: '50%',\n            cursor: 'pointer',\n            outline: 'none',\n            boxShadow: '0 2px 6px rgba(0,0,0,0.25)',\n            opacity: '0',\n            pointerEvents: 'none',\n            transition: 'opacity 0.2s ease',\n        });\n    }\n}\n","import type { IWebSocketAdapter, Tick, StreamStatus } from '../core/types.js';\n\n/**\n * Generic WebSocket adapter.\n *\n * Usage:\n *   const adapter = new WebSocketAdapter('wss://feed.example.com/ticks', msg => ({\n *     time:   new Date(msg.T).getTime(),\n *     bid:    msg.B,\n *     ask:    msg.A,\n *     volume: msg.v ?? 0,\n *   }));\n *   chart.connectStream(adapter);\n */\nexport class WebSocketAdapter implements IWebSocketAdapter {\n    private ws: WebSocket | null = null;\n    private tickCallbacks: ((tick: Tick) => void)[] = [];\n    private statusCallbacks: ((status: StreamStatus) => void)[] = [];\n    private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n    private reconnectDelay = 2000;\n    private destroyed = false;\n\n    constructor(\n        private readonly url: string,\n        /** Transform a raw server message into a Tick. Return null to skip. */\n        private readonly transform: (msg: unknown) => Tick | null = defaultTransform,\n    ) {}\n\n    connect(): void {\n        if (this.ws) return;\n        this.destroyed = false;\n        this.openSocket();\n    }\n\n    disconnect(): void {\n        this.destroyed = true;\n        if (this.reconnectTimer !== null) {\n            clearTimeout(this.reconnectTimer);\n            this.reconnectTimer = null;\n        }\n        if (this.ws) {\n            this.ws.close();\n            this.ws = null;\n        }\n        this.emitStatus('disconnected');\n    }\n\n    onTick(callback: (tick: Tick) => void): void {\n        this.tickCallbacks.push(callback);\n    }\n\n    onStatus(callback: (status: StreamStatus) => void): void {\n        this.statusCallbacks.push(callback);\n    }\n\n    // ── Private ───────────────────────────────────────────────────────────────\n\n    private openSocket(): void {\n        this.ws = new WebSocket(this.url);\n\n        this.ws.addEventListener('open', () => {\n            this.reconnectDelay = 2000;\n            this.emitStatus('connected');\n        });\n\n        this.ws.addEventListener('message', (event) => {\n            try {\n                const raw = typeof event.data === 'string' ? JSON.parse(event.data) : event.data;\n                const tick = this.transform(raw);\n                if (tick) this.tickCallbacks.forEach(cb => cb(tick));\n            } catch {\n                // ignore malformed messages\n            }\n        });\n\n        this.ws.addEventListener('close', () => {\n            this.ws = null;\n            if (!this.destroyed) {\n                this.emitStatus('reconnecting');\n                this.scheduleReconnect();\n            }\n        });\n\n        this.ws.addEventListener('error', () => {\n            this.ws?.close();\n        });\n    }\n\n    private scheduleReconnect(): void {\n        this.reconnectTimer = setTimeout(() => {\n            this.reconnectTimer = null;\n            if (!this.destroyed) this.openSocket();\n        }, this.reconnectDelay);\n        this.reconnectDelay = Math.min(this.reconnectDelay * 2, 30_000);\n    }\n\n    private emitStatus(status: StreamStatus): void {\n        this.statusCallbacks.forEach(cb => cb(status));\n    }\n}\n\n/** Default transform: expects `{ T: string, B: number, A: number }` (Centrifuge price format) */\nfunction defaultTransform(msg: unknown): Tick | null {\n    if (typeof msg !== 'object' || msg === null) return null;\n    const m = msg as Record<string, unknown>;\n    if (typeof m.B !== 'number' || typeof m.A !== 'number') return null;\n    const time = typeof m.T === 'string' ? new Date(m.T).getTime() : Date.now();\n    return {\n        time,\n        bid:    m.B as number,\n        ask:    m.A as number,\n        volume: typeof m.volume === 'number' ? m.volume : 0,\n    };\n}\n"]}